简述

二进制数字表示法三兄弟:

  • 原码
  • 补码
  • 反码

原码就是原来的编码,就是字面意思,而补码和反码比较奇怪,为什么需要这两种编码,意义是什么?

原码

原码表示法,正数没有区别,负数首位为1
3的原码 0000 0011
-3的原码 1000 0011

这个就这么简单,没什么可说的。

补码

这个是操作系统在对负数进行计算时的一种策略。
作用:解决二进制下表示负数的问题。

为什么需要补码,是什么情况下需要使用到补码。不用行不行?
不行
因为使用两个原码做加法,没法运算!!

不用行不行?
不行,不用玩不了。因为两个原码在二进制下无法做加法!!

使用二进制的第一位表示数字的正负位:
0表示正数,1表示数。

原码加法

原码之间无法直接进行计算,举个反例

2 + (-2) 结果应该是0,但是如果直接使用原码进行计算,结果溢出

1
2
3
4
0000 0010
1000 0010
---------
1000 0100

结果
期望是: 0
实际为: -4

现在解释为什么需要补码

为了得到正确的计算结果!!
如何能得到正确的计算结果?

再举个例子,这次是正确的例子: 2 + (-2) = 0
转换成二进制:

1
2
3
4
0000 0010
???? ????
---------
0000 0000

结果
0

也就是说,第二行?是什么样的二进制,才能得到正确的结果,才是关键!!

反码

其实已经有了结果了,那可以从结果中求和?的结果。
要得到补码,就需要反码参与通过反码算出补码。

推导过程

还是:2 + (-2)

1
2
3
4
0000 0010
1111 1110 <-- 十进制(-2)在计算机中真正的表示形态,即,补码
---------
0000 0000

负数计算补码步骤:
1.计算二进制的绝对值,即,该数除符号位之外的二进制有效数据位,符号位是要保留的。
2.按位取反
3.+1

1.计算二进制的绝对值
-2的绝对值,就是正2:

1
1000 0010 # 最高位保留符号 1

2.取反

这个就是反码

1
1111 1101        # 注意,上面说了,符号位是要保留的。

3.最后进行 +1

1
1111 1110

这个最终结果就是:补码

总结

有点繁索,但过程就是这么个过程,实际使用中无感知,但是必须了解这个原理,这也就是为什么 127+1=-128的由来。

1
2
3
4
0111 1111
0000 0001
---------
1000 0000