关于原码反码补码的认知

所有的原码反码补码都是在二进制的角度看.

原码

所谓原码,即一个数的原始二进制,其有以下特性:
– 最高位为符号位,0表示正,为1表示负.
– 其它数值部分就是数值本身绝对值的二进制数.
– 负数的原码是在其绝对值的基础上,最高位变为1.

使用原码存储带来2个问题:
0存在正负两种状态.
– 两个数相减,结果错误.

1-1 = 1 + (-1)
   +1: 0000 0001
   -1: 1000 0001
 结果: 1000 0010 = -2(Dec)

反码

反码有以下特性:
– 对于正数,反码与原码相同.
– 对于负数,符号位不变,其它部分取反(1变0,0变1).

使用反码存储带来1个问题:
0依旧存在正负两种状态.

1-1 = 1 + (-1)
  +1: 0000 0001
  -1: 1111 1110
结果: 1111 1111(反码) = 1000 0000(原码) = -0(Dec)

补码

补码有以下特性:
– 正数的原码/反码/补码是一样.
– 负数的补码,为负数的反码+1: 即最高位不变,其它位求反,然后再加1.

1-1 = 1 + (-1)

  +1:  0000 0001
  -1: 1111 1111
结果: 10000 0000 (越界,则最高位丢弃)

最终,计算机存储数据以补码的方式存储.