原码、反码、补码详述

写在前

作为一个非科班的it小白,对计算机的很多术语总是很懵逼,然后各种百度,各种博客查看,往往很多文章又是人云亦云,该篇文章主要讲解原码、反码、补码。通过记录各个‘码’的出现历史及原因,理解三者的关系,希望能够讲明白

**背景:**如何让计算机执行二进制的(+、-)运算,人脑基于常识(规则)可以识别(+、-)符号,然后运算出结果,那如何让计算机基于规则,运算出符合人们常识的结果呢

原码

一开始,人们约定在一个二进制数前用第一位(最高位)来表示符号,即1表示负,0表示正,这就是最初“原码”的概念(这就是概念)

号外:为啥叫32位操作系统:计算机可以一次处理2^32个数字(0、1)

# 以8位为例
0 0000001 => 0 0000001
-1 => 1 0000001

如何计算 1-1

0 0000001 + 1 0000001 = 1 0000010 (-2)

为啥是加号,人看着是减号运算。因为计算机的硬件结构中只有加法器,因此所有的运算均需转换为加法运算(二进制运算规则请自查)

在原码中0有+0和-0两种表示形式,存在二义性。

补码

为了避免在运算时,符号为单独处理,不知道哪个聪明大师想出了一个规则,该规则人们命名成了补码(这也是概念,理解了规则,也就理解了补码)
规则如下:
正数的补码和原码相同;负数的补码通过先把除符号位外其他各位取反,再在末位(最低位)加1得到

# 以8位为例
0 0000001 => 0 0000001
1 0000001 => 1 1111110 + 1 => 1 1111111
1 - 1 => 0 0000001 + 1 1111111 => 0 0000000 => 0(人认可的)
疑问:加法运算后,应该是9个数字 10 0000000,为啥是0 0000000。个人理解,我的计算机是8位操作系统,只能处理8位,多余的1,高位溢出(请知晓的大佬讲解一下)

聪明人想出补码的理论依据:
模:一个计算机运算的概念。一个计量单位称(或者理解为计算规则)

参考如下例子:

时钟是以十二进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数倍或减去(反拨)12的整数倍,时针的位置不变。
例如,从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射为+2。
由此可见,对于一个模数为12的循环系统来说,减10和加2的效果是一样的。所以,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这样就把减法问题转化成加法问题了

同理,如果计算机为8位的处理系统,则当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。显然,8位二进制数最大为(11111111=2^7 +…+20=28),即256。(个人理解,先取反,相当于钟表反转;再加1,相当于加二进制[0,1]的最大数字)

反码

通过对补码的了解,可以看出其实“反码”是“原码”向“补码”表示形式转变过程中的一个过渡形式。之所以当初会想到“反码”,是因为它太容易从电路上来实现了(仅需要取反就行了)。同时存在如下问题

1 => 0 0000001
-1=>1 0000001 => 1 1111110
0 0000001+1 1111110=1 1111111 = -0

移码

移码是一种比较特殊的二进制数表示形式。它的编码规则如下:
正数的符号位为1,负数的符号位为0;
真值部分与补码一样。(规则就是概念,可以理解为原码换算成补码后,再对符号位取反)

5的二进制移码(假设字长为8)为10000101 ,-5的二进制移码为01111011(它是对-5的补码符号取反的结果)

1 与 1
|  原码|反码  |补码 | 移码|
|--|--|--|--|
| 0 0000001 |0 0000001  |0 0000001|1 0000001|
| 1 0000001 |1 1111110  |1 1111111|0 1111111|

以上参考编码教程,个人理解,如有理解或者描述错误,欢迎探讨

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值