为便于表达,在这里假定是在8位机器表示

二进制补码表示

无符号十进制整数x的二进制表示是之间将x不断整除2,然后将余数反向排列得到。比如8的二进制表示为:0001000,7的二进制表示为00000111。二进制补码(two's-complement),是将字(word)的最高位解释为负权(negative weight),最高位为1时,表示值为负;最高位为0时,表示非负。

二进制补码的表示方式可以基于无符号整数的二进制来表示,需要经过两步:

1.取十进制数值的绝对值,转变为二进制表示方法,之后将每位取反;
2.增加符号位,如果为负数则加1

例如 8的二进制表示为00001000,-8的二进制补码表示为8(00001000)取反(11110111)加1->1111 1000

加法&减法

我们来做(-8) + (-5)的加法运算

  • -8 的补码表示为:(1111 1000),-5的补码表示为( 1111 1011 )
  1111 1000
+ 1111 1011
-------
1 1111 0011

在二进制补码计算时,如果最高位有进位,则被舍弃。因此(-8)+(-5)=-13的二进制补码结果为:1111 0011。
我们再做-8(1111 1000)+5(00000101)的操作:

 1111 1000
+0000 0101
---------- 
 1111 1101

其结果为1111 1101,按照补码表示方法其值为-3

理解了补码加减法运算的规则,可以发现,补码有以下两个优点:

  • 在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
  • 补码与原码的转换过程几乎是相同的。

减法比较好理解,可以将被减数按位取反之后,再按照加法规则计算。

References

深入理解计算机系统
关于2的补码