主要原因:1、使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理
这两句话什么意思,还是不太白,是怎么统一处理的,又是怎么把加法变成减法的,能形象解释下吗?
先看看补码的由来吧。
用十进制来说明,就比较好理解。
限定,使用 2 位 10 进制数:
24 - 1 = 23
24 + 99 = (一百) 23
进位一百,超出 2 位数,忽略。
此时,+99 和-1 就是等效的。
+99,就称为-1 的补数。
如果,可以使用 3 位数呢?
那么,-1 的补数,就是 +999。
负数的补数=负数 + 10^n, n 是位数。
-----------------------
计算机用二进制,补数,就改称为:补码。
使用补码,就可以把减法,转换成加法运算,从而简化硬件。
8 位 2 进制的范围是:0000 0000 ~ 1111 1111 (十进制 255)。
-1 的补码,就是:-1 + 2^8 = 255 = 1111 1111(二进制)。
-2 的补码,就是:-2 + 256 = 254 = 1111 1110。
。。。
-128 的补码,是:-128 + 256 = 128 = 1000 0000。
负数的补码,就是这么来的。
补码,与原码反码毫无关系。
-----------------------
为什么是“取反、加一”?
下面用四位二进制来说明。
如果 X =-xxxx。
前面的负号(-)说明 X 是负数。后面的 x,是 1 或 0。
那么,[X]补 = -xxxx + 2^4
= -xxxx + 1 0000。
式中的 1 0000,可以写成: 1 + 1111。
那么,[X]补 = 1111-xxxx + 1。
式中的 1111-xxxx:
如果 x 是 0,1-x 就是 1。
如果 x 是 1,1-x 就是 0。
所以,这就是对 xxxx 取反。
式中的 + 1:
就是在取反之后,再加上 1。
经过“取反、加一”就得到 X 的补码了。
注意:
取反时,只是对 X 的绝对值 xxxx 取反。
此时,既没有说到“原码”,也没有说“反码”。
更没有说“符号位不变”。
所以,补码与“原码、反码和符号位”都没有关系。