计算机中的减法
首先,介绍根据位运算衍生出的三个概念:
正数 | 负数 | |
---|---|---|
原码 | 带符号位的,二进制表示的数值 | 带符号位的,二进制表示的数值 |
反码 | 同原码 | 除了符号位之外其余位取反 |
补码 | 同原码 | 反码 + 1 |
补码+1是为了消除原码的“负0”(不然“路过”0的加减法会出错),因此负数的表示要加1。
计算机处理器没有加法引擎,减法是通过加法实现的。
在计算机中,两个数的减法是:
第一个数和第二个数的负数,两个数的补码相加,再求补码,以得到的结果为原码的数字就是计算结果
可能有点绕口,下面看两个例子。
计算 8 - 2 和 2 - 8(5位计算机系统)
先用二进制表示原来的数是:
8 = 01000
2 = 00010
8 的原码反码补码都是 01000(正数嘛)
2 加上符号位:10010,这是 -2 的原码
-2 原码除符号位取反是:11101,这是 -2 的反码
-2 反码再加1是:11110,这是 -2 的补码
计算过程:
以 8 - 2 为例,8 - 2 = 8 + (-2) = 8 + (16 - 2)
(这里 + 16 是:第一位为符号位,负数符号位是1,也就是 + 16,更好的解释可以参考相关书籍,先意会一下。这一步配合取补码的数学原理,可以作为下列步骤的数学证明,这里就不展开了)
01000 是 8 的补码
+ 11110 是 -2 的补码
= 00110 这一步啥也不是,hh
取补码 00110 是 6 的原码,因此 8 - 2 = 6
以 2 - 8 为例,2 - 8 = 2 + (-8) = 2 + (16 - 8)
(省略求补码的过程)
00010 是 2 的补码
+ 11000 是 -8 的补码
= 11010 啥也不是
取补码 10110 是 -6 的原码,因此 2 - 8 = -6
参考博客: