3.2 补码
最后更新于
最后更新于
在算术运算中,加法是最基本的操作,因为其他的运算都可以通过加法来完成。例如减法就是加上一个负数,而乘法与除法可以分别通过加法与减法来实现。
这里需要解决一个问题,就是如何在二进制中表示负数,以便将减法操作变为加法操作,而不是再重新设计一个减法器的电子组件。
我们来看一下产生负数的最基本操作:0 - 1:
不管是多少位的减法运算都可以表示为上述形式,因为需要借位,所以结果中每一位都是1(我们假设最左边依然借了一位过来,只是空间的有限无法展示)。那么如何用一串 1 表示 -1 呢?我们知道对于一个 n 位全是 1 的二进制数字, 其数值是: 2^(n-1) + 2^(n-2) + ... + 2^1 + 2^0
, 该数列的和为 2^n - 1
, 因此,如果我们将最高位的权值设置为 -1 的话,那么整个二进制数字的值就刚好是 -1, 如下图所示:
我们来验证一下使用这种方式对整数进行编码时,能否用加法规则完成减法运算:
表格后三列的结果中最高位产生了进位,在现实系统中会因为溢出而被丢弃,因此忽略后三列的最高位后,各列的实际结果为:
111…1111 = -1
111…1110 = -2
000…0001 = 1
000…0000 = 0
所有的运算与预期结果完全一致!
这种对数字进行编码的方式叫补码(2’s complement),补码的优点在于我们可以使用同一套计算规则完成加法、减法两种运算,这样所有的算术运算,包括乘法、除法以及开平方根等,都可以使用加法来完成了。这意味着理论上仅仅通过全加器,使用补码对数字进行编码,就可以搭建出具备完整计算能力的计算机。
补码让加法器成为了二进制世界中算术运算的基础积木。
1 - 2 = -1
-1 - 1 = -2
2 - 1 = 1
1 - 1 = 0
000…0001
+111...1110
111...1111
+111...1111
000…0010
+111...1111
000…0001
+111...1111
111…1111
1111…1110
1000…0001
1000…0000