取反加一,并不是补码的定义。
补码的来源,并不是什么原码反码符号位以及取反加一。
补码,其实,是一个“代替负数运算的”的正数。
借助于补码,减法,就可以用加法代替。
利用补码,统一了加减法,目的是简化计算机的硬件。
--------------------------
为什么正数(补码)能够代替负数呢?
用十进制来说明,比较容易理解。
如果限定【仅用 2 位 10 进制数】,可以有:
24 - 1 = 23
24 + 99 = (一百) 23
保留 2 位数,就必须舍弃进位。
此时,+99 就和-1 是等效的。
+99,就称为-1 的补数。
+98,是-2 的补数。
。。。
如果,使用 3 位 10 进制数,-1 的补数,就是+999 了。
求补数的公式:
补数 = 负数 + 10^n, n 是位数。
--------------------------
计算机使用 2 进制,补数,就改称为:补码。
8 位 2 进制的范围:0000 0000~1111 1111 (十进制 255)。
共有 2^8 = 256 组。
此时,-1 的补码,就是 255 (1111 1111)。
同理,-2 的补码是 254 (1111 1110)。
求补码的公式:
补码 = 负数 + 2^n, n 是位数。
只有负数,才需要用补码替换。
正数,不存在变换成补码的问题。
在 256 组二进制中,用 128 组来代替负数:-1~-128。
-128 的补码是:-128 + 2^8 = 128 = 1000 0000。
以上,就是【补码的来源,以及意义】。
--------------------------
为什么是“取反加一”?
下面用 4 位二进制数来说明。
假设一个负的二进制数是:X =-xxxx。
负号(-)说明 X 是负数。后面的 xxxx,是绝对值。
那么,[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 取反。
此时,既没有说到“原码”,也没有说“反码”。更没有说“符号位不变”。
所以,虽然可以用“取反加一”求出补码,但是,这个补码,与“原码、反码和符号位”都没有任何关系。
特别是-128,它并没有原码和反码,怎么求补码呢?
那么,原码反码符号位,有嘛用? 又是哪来的呢?
真是怪事。