补码

正数的原码补码反码都相同。

负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。

负数的反码:符号位为“1”,数值部分按位取反。

同一个数字,不同位数的补码,表示形式不同。比方说-15的补码,在8位2进制里头是11110001,然而在16位2进制补码表示的情况下,就成了1111111111110001。

“模”是指一个计量系统的计数范围。例如:时钟的计量范围是0~11,模=12.表示n位的计算机计量范围是0~(2^n) - 1,模 = 2^n。

计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为8=256。在计算中,两个互补的数称为“补码”。


下面内容转自(http://blog.csdn.net/lmjq/article/details/5450292)

下面我就尝试着来证明一下,为什么负数的补码等于反码加一。
理解下面的推导要求读者必须了解模数的概念和求模运算。

假设我们的运算使用n位二进制数,那么这n位二进制数的模数为2n ,数α为一个用n位二进制表示的常数,数x为一个用n位二进制表 示的变数,那么α < 2n ,x < 2n 是成立的,在这里α与x都是用原码表示的。现在 我们从α减掉x,推导如下:

α – x = 2n %2n + (α – x) % 2n 
        = (2n + (α – x)) % 2n 
        = (α + 2n – x) % 2n 
        = (α) % 2n + (2n – x) % 2n 
        = α + (2n – x)

我们现在将α – x这个减法运算成功演化成了 α + (2n – x)这个加法运算。从模数的概念我们知道,如果两个数相加等于其模数,那么这两个数是互补的。在这里x与2n – x是互补的,减掉数x与加上其补数2n – x是相等的。在这里还隐藏了一层含义,一个正数加上一个负数,如果有进位产生,把进位简单的舍弃掉是不影响计算结果的。
我们得出第一个结论:
xcom = 2n – x

反码则简单的多,一个数的全部二进制位取反则得到其反码,由此可知,如果一个数加上它的反码,则此全部二进制位是满的,也就是全部是1,其值为2n-1 + 2n-2 + … + 22 + 21 + 20 = 2n – 1
我们得出第二个结论
xneg = 2n – 1 – x

综合结论一和二,我们可以做如下推导:
xcom = 2n – x
        = 2n – 1 – x + 1
        = xneg + 1

至此我们得出最终结论一个n位二进制数的补数等于其反码加一。

我们再回头看看,我们曾经说“x与2n – x是互补的,减掉数x与加上其补数2n – x是相等的”,减掉数x,我们可以看做是加-x,也就是”加-x”与”加2n – x”是对等的,那么在计算机中-x用2n – x做其补码就顺理成章了,注意这里说的是补码而不是补数。

现在我们把x替换为1,n替换为8,得出-1的补码为28 -1=255=0xFF,这就是-1在计算机里面的真实面目。当然 对于正数就另当别论了。


原文地址:https://www.cnblogs.com/realwall/p/2159953.html