问题: 为什么计算机里要存在补码,只有反码不可以吗?
我们想求 2 - 1,但我们不想在计算机内部用减法去完成这件事
所以,我们可以曲线救国,利用高位溢出,使用2 + 127-128去完成
什么叫高位溢出呢?
1111 1111 + 0000 0001 结果是1 0000 0000 ,但新的最高位计算机保存不下,就抛弃了
上述过程转换成十进制即:(目的)127 + 1 ==> (实际)127 + 1 -128 ==> 0
如果不用补码直接用反码会发生什么呢?
先来看一下 怎么求出反码:
原码:0000 0001
反码:1111 1110
原码是1,反码就变成了 126。
发现规律了吗?
反码是由 1111 1111 - 0000 0001 得到的,即127 - 1得到的
回到上面,如果 -1 在内部用反码存储,2 + (- 1) 就会变成 2 + 126 - 128 = 0,与目标数值1相比小了1
从二进制角度看一下上述过程
0000 0010 + 1111 1110 = 1 0000 0000
根本原因是什么?
最高位不一致。我们的目的是让 -1 在内部保存为 127(即128-1),这样就可以通过高位溢出,最后减去128得到原来的值 -1。
但是128的二进制是1 0000 0000,位数超过了8位,计算机内部保存不了,所以没办法直接使用128-1得到127。
反码最大只能是127,二进制即1111 1111,这是计算机内部可以保存的最大数值,离 128 差了0000 0001。
因此,需要存在补码【反码 +1 =(127-x)+ 1 = 127+1 - x】,这样就可以得到 128 - x。
最后,我们就能够达到最终目的:利用高位溢出可以使加法变成减法。
分析完毕,上述只拿了8位的int举例,16位36位也是如此。