补码是一种用二进制表示有符号数的方法。正数和 0 的补码就是该数字本身。负数的补码则是将其对应正数按位取反再加 1。补码系统的最大优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有符号数加法,而且减法可以用一个数加上另一个数的补码来表示,因此只要有加法电路和补码电路即可以完成各种有符号数加法和减法,在电路设计上相当方便。
另外,补码系统的 0 就只有一个表示方式,这和反码系统不同(在反码系统中,0 有两种表示方式),因此在判断数字是否为 0 时,只要比较一次即可。下图是一些 8 位补码系统的整数,它可表示的范围包括 -128 到 127,总共 256 个整数。
既然说补码可以解决反码在运算中遇到的问题,我们继续以 6 + (-3)
为例来验证一下这个结论。
十进制 | 原码 | 反码 | 补码 |
---|---|---|---|
6 | 0000 0110 | 0000 0110 | 0000 0110 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
6 + (-3)
以补码形式的计算过程如下:
6 - 3 ==> 6 + (-3) 0000 0110 // 6(补码) + 1111 1101 // -3(补码) ---------------------- 0000 0011 // 3(补码)
很明显这时我们得到了正确的结果,那么我们再来看一下以补码形式计算 1 - 1
的计算过程:
1 - 1 ==> 1 + (-1) 0000 0001 // 1(补码) + 1111 1111 // -1(补码) ---------------------- 0000 0000 // 0(补码)