0x55AA 发表于 2014-12-30 16:17:47

关于补码

关于补码:
为什么要用补码?
计算机中只有加法,所谓的减法也是加法。为了理解补码,我们可以考虑到钟表的例子。钟表一圈是12个时辰,也就是12小时,3点+4点 = 7点,3点 + 10点 =?(对不起,越界了,不能表示),因为它是12进制,也就是说只能表示0-11这12个点,超过了就越位了,就不能计算了。所以针对这个范围,我们只能计算结果在(0-11)的数。
那么针对减法诸如 8点 - 7点 该怎么计算呢?这时候就用到了补码的知识了,8点 - 7点 = 8点 + (-7点)= 8点 + 5点 - 12点 。8点 + 5点肯定会越位产生进位,但是我们最后又把这个进位给减了,所以最终的结果是正确的。

关于2进制的减法
为什么负数的补码 = 反码 + 1?
对于具有n位的2进制的数,其能表达的范围是(0 ,2^n -1),产生进位的时候就是2^n了,所以负数的补码 = 2^n - 该负数的绝对值 = (2^n - 1) - 该负数绝对值 + 1 = (反码)+ 1.

计算机中整数的表示
计算机中是采用2进制补码表示整数的,当然非负数的补码就是其自身,对于n位2进制来说,其非负数的补码表示范围是
(0 - 2^n-1).那么针对负数呢-1 ~ -(2^n-1)其对应的补码范围就是(2^n-1)~ 1了。
有时候会把最高位当做符号位,最高位是0表示非负数,最高位是1表示负数,那么此时针对(-2^n)其补码会是2^n,这时候n位的2进制上都是0,但是因为在(n+1)位是标志位,所以最大负数表示的是1 00000000……。0表示的是 0 0000000……。
结论:对于带符号位的(n+1)2进制来说,其能表示的最大范围是(-2^n -- 2^n-1).
页: [1]
查看完整版本: 关于补码