补码

作者: 再帅就满分了 | 来源:发表于2020-06-13 13:39 被阅读0次

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

    首先整理三个概念:

    原码:

    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)也是可以的。

    相关文章

      网友评论

          本文标题:补码

          本文链接:https://www.haomeiwen.com/subject/zhvatktx.html