理解二进制的原码、反码、补码
2019-10-03 13:21:54 magic_1024 阅读数 39更多
一、什么是二进制
在说二进制之前,我们先回想下平常我们用的最多的十进制,1,0,50,-100,899等等这些数字我们在熟悉不过了,牵扯到我们的衣食住行方方面面。组成十进制的数字符号集合为{0,1,2,3,4,5,6,7,8,9}共十个元素。十进制的运算规则为:
1.“满十进一,借一当十”
2.按位权展开,第一位权为10^0, 第二位位权为10^1 ……以此类推,第N位10^(N-1),这也就是我们说的位置化数字系统,在数字中符号所占据的位置决定了其表示的值
例如,十进制数字698在位置化系统中含义:
这里我们看到,位权中的基数跟进制的符合集合个数有关,十进制有0~9共十个符号,所以十进制的位权基数为10,基数的幂从0开始到n-1。
有了十进制的铺垫,那么二进制理解起来就不会那么难了。二进制是计算机存储程序和数据的标准形式,二进制的符号集为{0,1},所以二进制只能以0、1的组合去表示数字,类比十进制规则,它的规则则是:
1.满二进一,借一当二
2.按位权展开,基数为2,第一位权为2^0, 第二位置位权为2^1 ……以此类推,第N位2^(N-1),同样遵循位置化数字系统规则
例如,数字6的二进制表示为110:
十进制如何转换二进制呢?
十进制转换为二进制很简单,使用十进制数除以2取余数,直到商为0,所得的余数倒序排列。
例如我们将十进制的数字8转换为二进制表示的运算过程:
二、原码
存储到计算机之中的数据都被转换为了二进制形式,但是还有问题需要解决:如何存储数字的符号?
如果不考虑数字的符号,对于n位存储单元,所能存储的范围为[0~2^n-1],例如n=4时,它能表示的范围就是0 ~ 15。
但我们都知道,数字有正数、负数之分,因此原码表示法规定了,在n位的存储单元中,使用最左1个二进制位表示符号,0表示正,1表示负,其余位置表示数字的绝对值。
例如n=4的存储单元,所能存储的无符号数范围为[0~2^n-1],最左位当做符号位置后,可以仅用剩余3位表示数字的绝对值。 从上图我们可以看到n=4位的存储单元,使用原码表示法时,被分为了两个相等的子范围即是正整数0000 ~ 0111和负整数1000 ~ 1111。
所以总结起来原码表示法,n位的存储单元可存储数字范围为-(2^n-1 - 1)至 +(2^n-1 - 1),并且原码表示法中有两个0,+0 和 -0
三、反码
原码在计算机存储整数中并不常用,计算机使用二进制补码来表示n位存储单元中的有符号整数。
反码是由原码转换为补码的中间形式,该运算可以应用到任何整数,无论是正的还是是负的,进行反码运算时,最左边符号位保持不变,当此数字为负数时,其绝对值位各位求反;正数反码为这个数本身
例如n=4位存储单位中数字3的反码:
-3的反码:
四、补码
几乎所有计算机都使用使用二进制补码来表示n位存储单元中的有符号整数。那么如何获得一个数补码,规则很简单:
正数的补码为其本身;
负数的补码为其反码在加上1得到的结果;
例如在4位的存储单位中,-5的补码表示:
例如在n=4位的存储单元中,还原1 0 1 1所表示的整数:
所以总结起来,计算机以二进制补码存储正数遵循以下步骤:
①将整数转换为n位的二进数
②如果整数是正数或零,以其原样存储,如果是负数,计算机取其补码。
而从二进制补码还原为整数,遵循如下步骤:
①如果最左位是1,计算机取其补码。如果是0,不进行任何操作
②将该整数转换为十进制
四、为什么使用补码
计算机采用二进制补码表示的优点在于加法和减法之间没有区别,当遇到减法运算时,计算机可以简单的把它转变为加法,只需要求为第二个数求二进制的补码即可。这样符号位就能参与运算,降低了计算机逻辑电路复杂度。
例如在n=4位存储单元,计算机计算5-3时,可以按照5+(-3)处理
得到结果0010按照补码->十进制整数转换规则,结果是2
补充:二进制补码加法与十进制加法一样,列与列相加,满二进一,如果有进位,就加到下一列,但是最后一列进位要舍弃(如图中的红色标识的1)。