计算机中整数的编码往往不是简单的数值的二进制表示,最常见的有符号数的计算机表示方式就是补码,最高位为符号位。
原码表示
在看补码之前先了解一下原码
decimal | binary | decimal | binary |
---|---|---|---|
0 | 0000 | -0 | 1000 |
1 | 0001 | -1 | 1001 |
2 | 0010 | -2 | 1010 |
3 | 0011 | -3 | 1011 |
4 | 0100 | -4 | 1100 |
最高位是符号位,“0”代表正,“1”代表负,数值部分为十进制数值对应的二进制。容易理解,但是缺点明显,从上表中可以看到0的表示不唯一(0000;1000)不利于编程;加减法运算方式不统一;需额外对符号位进行处理,故不利于硬件设计;特别当a<b时,实现a-b比较困难。
故从五十年代开始,整数都采用补码表示。但是浮点数的尾数用原码定点小数表示。
补码表示
学习补码要先理解有关模运算的概念。在一个模运算系统中一个数与它除以“模”后的余数等价。时钟就是一个模十二的系统。
例
现在的时间是八点,五小时后是一点
8+5=13 ≡ 1 (mod 12)
同样有 8-7=1
即 -7≡5 (mod 12)
一个复数的补码等于模减去该复数的绝对值。0的补码表示是唯一的。
当模确定时,一个数减去小于模的另一数的运算,如a-b,可以转化为a加-b的模。这样就实现了加减法的统一,方便计算机实现。计算机中的运算器就是模运算系统。
设运算器有n位,则运算结果只能保留n位,真值的范围为-2n~2n-1(0的存在使范围不对称),可看成是模为2n的钟表系统(一个超大表盘)。
关于补码的求法
补码定义:[X]补 =2n+X
- 若为正数,数值部分相同;若为负数,数值部分各位取反,末位加一。
例:
[0110]补
=24+0110
=1 0000+0110
=0110 (mod 24)
[-0010]补
=24-0010
=1 0000-0010
=1111-0010+1(各位取反,末位加一)
=1110 - 简便方法:真值的数值部分(绝对值的二进制表示)从右向左遇到第一个1的前面各位取反。
将补码转化为真值
正数可以直接根据各位上的权值求出真值。这里重点记录负数的求法。最容易理解的方法是将求补码的过程逆着进行一遍。
更简单的方法是直接根据补码上的权值求真值,这样不用区分正负。最高位权值为负,为-2n-1,其他位正常。
对于负数还可将补码再次各位取反后加一,得到的就是真值,最后再把符号加上就可以了。