什么是补码
补码是有符号数的一种二进制表示方式。补码,是一个“代替负数”的正数。使用了补码,计算机中,就没有负数了,同时,也就没有了减法运算。因此,使用补码,就可以简化算法,简化硬件。
我们用B2Tw来表示一个补码。其中w代表二进制数的位长,B2T的含义其实是“二进制转补码”。计算补码实际表示的数,我们需要将每一位上的值和对应权重相乘然后进行相加。每一位(索引记为i,从0开始,从右往左递增)的权重为2i,但最高位的权重比较特殊,需要取负数,为-2w-1。
对于一个位长为w的补码表示,最大值TMaxw为2^(w-1) - 1,此时最高位为0,其余位都是1。最小值TMinw为-2^(w-1),此时最高位为1,其余位都是0。如对于4位的补码,最大值TMax4 = B2T4(),对应的值为2^3 - 1 = 7,最小值为B2T4(),对应的值为-2^3 = -8。
正数的补码就是原码本身,负数的补码是其反码加1。计算机中的有符号数有即原码、反码和补码。三种表示方法均有符号位和数值位两部分。
符号位都是用0表示“正”,用1表示“负”。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
在计算机系统中,数值,一律采用补码表示和存储。
原码和反码,计算机中,都是不存在的。
补码,其实,就是一个“代替负数”的正数。
使用了补码,计算机中就没有负数了,也就没有了减法运算。
使用了补码,可以简化算法,从而就能简化计算机的硬件。
原码和反码,都没有这种功能,所以,它们根本就没有用!
------------------------
补码(即正数),怎么能代替负数呢?
根源在于“计数系统的周期性”。
如果使用 2 位 10 进制数(0~99),计数周期就是 10^2 = 100。
此时,就可以有:
25 - 1 = 24
25 + 99 = (一百) 24
舍弃进位,只取两位数,这两种算法,功能就完全相同。
+99,就能代替-1。
+98,也可以代替-2。
。。。
这些“代替负数的正数”,就可称为“负数的补数”。
关系式:补数 = 负数 + 10^n。
n 是补数的位数。
10^n 是 n 位数的计数周期。
-------------------------
这个关系式,在计算机中,也可以使用。
8 位 2 进制:0000 0000~1111 1111 (十进制 255)。
它们的计数周期是:2^8 = 256。
计算机用二进制,补数,就改称为:补码。
求负数补码的计算公式,也是: 补码 = 负数 + 周期。
-1 补码就是:-1 + 256 = 255 = 1111 1111(二进制)。
-2 的补码是: 254 = 1111 1110。
。。。
正数,不可转换,必须直接参加运算。
所以,零和正数,并不存在补码。
-------------------------
用八位补码计算:5 - 7 = -2。
列竖式计算如下:
5 = 0000 0101
-7的补码 = 1111 1001
--相加-------------
得: (1) 1111 1110 = -2 的补码
舍弃进位,只保留八位,这就用加法,实现了 5-7。
-------------------------
补码和“符号位原码反码 ... ”,并无半点关系。
“符号位原码反码取反加一符号位不变”,数学不好的老外,才会用这些骚操作。
当你理解了“周期性”,就不必理会那些无聊的说法。