负数为什么要用补码来表示?
上篇文章讲了“负数在计算机中是怎么存储的”。看完之后,应该对原码,反码,补码有了基本的了解了。 今天,我们深入探讨一下,为什么计算机中要用补码来表示负数? 首先,我们应该清楚,原码是方便给人看的。看到一个数的原码,我们就能根据符号位和后边的二进制位,计算出这个数的实际值。为了简单起见,我以一个字节8位来举例,如 // 1 的原码 ,最高位0代表正数 0000 0001 // -1 的原码, 最高位1代表负数 1000 0001 可以看到,1和 -1 的原码只有符号位不同。然后,思考一个问题,1 - 1 = ? 是的,我们可以直接通过减法去计算,得出1-1=0 。但是,做减法运算时,可能会遇到不够减而需要借位的情况,这显然是比较麻烦的。我们换一种思路。 1-1 在数学中等同于 1+(-1)。这样,把减法转换为加法就简单的多了,只需要考虑进位就可以了。(其实,计算机中只有加法器,没有减法器,因此减法是通过加法器来计算的。) 于是,我们看下,把1和-1的原码相加等于多少(需要让符号位也参与运算) 0000 0001 + 1000 0001 1000 0010 结果是 -2 ,这显然不符合我们的预期。 为了解决原码减法的问题,于是,出现了反码。使用反码,再来计算一下。 // 1的反码,同原码 0000 0001 // -1的反码,符号位不变,其他取反 1111 1110 相加之后,得