补码

突然想到计算机数字在内存中的存储方式,都知道正数在计算机中存储的是原码,负数在计算机中存储的是补码, 一时懵逼为什么负整数要存补码一番梳理之后又重新理解了,温故而知新!

首先整理三个概念:

原码:

1的原码是:00000000 00000000 00000000 00000001
5的原码是:00000000 00000000 00000000 00000101

反码:
正数的反码与原码相同,负整数的反码为对该数的原码除符号位外取反

-1的原码是: 10000000 00000000 00000000 00000001
-1的反码是: 11111111 11111111 11111111 11111110

补码:
正数的补码与原码相同;
负数的补码为: 反码 + 1

-1的反码是:               11111111 11111111 11111111 11111110
-1的补码 = -1反码 + 1  =  11111111 11111111 11111111 11111111

重点:
为什么正整数用原码 ,负数用补码 ? 我们知道CPU只有累加器但是没有累减器。但是又要计算减法运算怎么办呢? 简单: 5 - 5 = 5 + (-5) 反应到二进制上

5  =  00000000 00000000 00000000 00000101
-5 =  10000000 00000000 00000000 00000101
所以 5 + (-5) = 0 = 10000000 00000000 00000000 00001010

等等 ~ 好像不对啊 应该是 000000000 00000000 00000000 00000000 才对怎么等于 -10了??

所以负数不能直接用原码!!!

任何正数 A - A = 0但是计算机中只能用A + (-A)的形式去做减法运算 ;
以上面的 5为例 5 - 5 = 5 + (-5) = 0

       5的原码是:   00000000 00000000 00000000 00000101
      -5的原码是:   10000000 00000000 00000000 00000101
      -5的反码是:   11111111 11111111 11111111 11111010
5的原码 + -5的反码 = 11111111 11111111 11111111 11111111 

所以可以反推任何正数A
A的原码加-A的反码都等于: 11111111 11111111 11111111 11111111
A的原码 + -A的反码 + 1 = 000000000 00000000 00000000 00000000 刚好等于0 结果正确
-A的反码 + 1 刚好是补码 所以负数在计算机中是以补码存储的

扩展:
5-2 可以理解 3 + 2 + (- 2) = 3的原码 + 2的原码 + (-2)的补码 = 3
同理验证
-2 - 2 = (-2) + (-2)也是可以的。

你可能感兴趣的:(补码)