Oasis's Cloud

一个人的首要责任,就是要有雄心。雄心是一种高尚的激情,它可以采取多种合理的形式。
—— 《一个数学家的辩白》

程序是怎么跑起来的

二的补码(Two's complement)

作者:oasis


二的补码(Two's complement)

补码的计算

正数的原码、反码、补码是一样的。

+1 为例:

  • 原码:0000 0001
  • 反码:0000 0001
  • 补码:0000 0001

负数的原码按位取反(符号位不变)得到反码,反码加 1 得到补码。

1 为例:

  • 原码:1000 0001
  • 反码:1111 1110(符号位不变,其余各位取反)
  • 补码:1111 1111(反码 +1

补码可以简化 CPU 对于减法电路的设计,从而用加法电路实现减法。

补码的源自模运算。可以用十进制来举例:39

3+(109)=3+1=4410=6

为什么用 109 来表示 9

有一条跑道,从起点到终点,每间隔 1 米标注一个点:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

39 表示的一个实际情况是:A 先从起点跑到 3 的位置。

之后,A 从 10 的位置向左跑 9 米,就跑到了 1 的位置。然后计算正向的跑动是 3+1,但 A 从 10 的位置向左跑时,已经多出来了 10。所以让 4 再减去 10,就能得到真实的距离。

如何获取真值

对于二进制,需要对补码再次求补码得到绝对值,然后加上负号。

补码为:

1111 1110

执行补码运算:

0000 0001+1=0000 0010=2

加负号,得到真值 2