先说结论:为了“消灭”计算机世界中的减法(或者说用加法实现减法)
那么为什么不是消灭加法呢?因为加法比减法简单,对于二进制数来说,与预算 & 可以表示两个数相加的结果(不考虑进位),异或运算 ^ 结果左移一位,可以表示两个数相加的进位。
那如何将减法变成加法呢?从我们熟悉的十进制来看,对于 56 - 28 可以如下操作:
56 - 28 =
56 + (72 - 100) =
128 - 100 =
28
我们可能会有疑惑,从上面操作来看,最后仍然是执行了一个减法(128 - 100)才得到答案呀?没错,但是这两个减法的难度显然不是一样的,后者的减法就是直接去掉最高位,就能得到答案,对于二进制来说去掉最高位是非常简单可以接受的。
用二进制数(8 位)来计算 56 -28,一样采用上面的步骤如下:
11100100 - 00011100 =
11100100 + (100000000 - 00011100) - 100000000 =
// 100000000 拆分成 11111111 + 1
11100100 + ( 11111111 - 00011100 + 1) - 100000000 =
11100100 + 11100100 - 100000000 =
100011100 - 100000000 =
00011100
注意到,其中 11111111 - 00011100 + 1 操作描述起来就是:将原码取反再加 1 (11111111 - 00011100 的结果就是 00011100 所有位取反)
由于二进制限制是 8 位,所以最终的减法是自动完成的(最高位 1 被舍弃)
综上,在二进制里 11100100 - 00011100 = 11100100 + ( 11111111 - 00011100 + 1) ,于是我们将减法视为加法时,就有 - 00011100 = 11100100 + ( 11111111 - 00011100 + 1) ,这正是补码计算方法的由来。
有了补码的定义,计算机世界就没有减法了!