加法和减法是计算机中最基本的运算,计算机时时刻刻都离不开它们,所以它们由硬件直接支持。为了提高加减法的运算效率,硬件电路要设计得尽量简单。
对于有符号数,内存要区分符号位和数值位,对于人脑来说,很容易辨别,但是对于计算机来说,就要设计专门的电路,这无疑增加了硬件的复杂性,增加了计算的时间。要是能把符号位和数值位等同起来,让它们一起参与运算,不再加以区分,这样硬件电路就变得简单了。
另外,加法和减法也可以合并为一种运算,就是加法运算,因为减去一个数相当于加上这个数的相反数,例如,5 - 3 等价于 5 + (-3),10 - (-9) 等价于 10 + 9。
如果能够实现上面的两个目标,那么只要设计一种简单的、不用区分符号位和数值位的加法电路,就能同时实现加法和减法运算,并且非常高效。实际上,这两个目标都已经实现了,真正的计算机硬件电路就是如此简单。
然而,简化硬件电路是有代价的,这个代价就是有符号数在存储和读取时都要进行转化。那么,这个转换过程究竟是怎样的呢?接下来我们就详细地讲解一下。
首先,请读者先记住下面的几个概念。
1) 原码
将一个整数转换成二进制形式,就是其原码。例如short a = 6;
,a 的原码就是0000 0000 0000 0110
;更改 a 的值a = -18;
,此时 a 的原码就是1000 0000 0001 0010
。
通俗的理解,原码就是一个整数本来的二进制形式。
2) 反码
谈到反码,正数和负数要区别对待,因为它们的反码不一样。
对于正数,它的反码就是其原码(原码和反码相同);负数的反码是将原码中除符号位以外的所有位(数值位)取反,也就是 0 变成 1,1 变成 0。例如short a = 6;
,a 的原码和反码都是0000 0000 0000 0110
;更改 a 的值a = -18;
,此时 a 的反码是1111 1111 1110 1101
。
3) 补码
正数和负数的补码也不一样,也要区别对待。
对于正数,它的补码就是其原码(原码、反码、补码都相同);负数的补码是其