前言
补码(Two’s complement) 是一种用二进制表示有符号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。
采用补码存储的最大优点是只用一种运算方法就能计算正数和负数,不用考虑操作数的正负号。在做减法时可转换成加上被减数的相反数的补码,这样计算单元内只要有加法电路和补码电路就能完成各种整数的加减运算,极大简化了电路上的设计。另外使用补码系统后就不会出现 +0 和 -0 两种 0 的表示方式,减少了数据运算的复杂度。
正文
为什么使用补码可以使加法计算出减法的效果呢,这是巧妙运用了存储单元的溢出机制。举一个同样存在“溢出”的例子:时钟。
在时钟里,时针的最大刻度是 12,超过这个值(称为模)将回到起点。假设现在要把时针从 4 点钟调到 1 点钟,可以逆时针减 3 小时,也可以顺时针加 9 小时,效果是完全一样的。于是在时针系统里存在:4-3 = 4+9,在模为 12 的时针系统里 3 和 9 就是一对补数,利用补数形式可将式子写成:4-3 = 4+(12-3)。再将时针回到原点看成是取模运算的话,就能得到: (4-3) mod 12 = [4+(12-3)] mod 12 = 1,等式严格成立。