美文网首页C/C++编程
原码、反码、补码

原码、反码、补码

作者: Sivin | 来源:发表于2016-09-05 14:39 被阅读75次

    原码、反码、补码

    标签(空格分隔): C语言


    一个数在计算机中式以二进制的形式存在。通常我们称为机器数机器数是有符号的,在计算机中最高位存放符号位。其中正数的符号位为0,负数的符号位为1

    原码:符号位加上其余位的真值的绝对值

    这里以字长位 8 位的机器为例

    例如:3的原码就是 0000 0011 
         -3的原码就是 1000 0011
    

    反码:对于正数而言,反码就是原码,对于负数而言,反码是除号位之外,其余各位取反

    例如:3的反码是:0000 0011
         -3的反码是:1111 1100
    

    由于计算机在用原码参与计算时需要考虑到符号位,效率比较低下,因此在计算机中,负数通常是以补码的形式存放在内存中的。
    补码:对于正数而言,原码,反码,补码,是一致的,对于负数而言,补码等于反码加一

    例如:3的补码是:0000 0011
        -3的补码是:1111 1101
    

    计算 3-3

    0000 0011  + 1111 0100 = 0000 0000 =0
    

    计算 5-7

    0000 0101 + 1111 1001 = 1111 1110------> -2的补码
    

    思考:不知道大家想过这个问题没有?为什么对于字长为8位的数值类型存储范围为什么是 -128到127呢?

    答:在计算机中的数值是以补码的形式存放的,因为使用原码和反码存放时会出现一个1000 0000 我们叫负零,我们认为负零这个数多余的,我们想让0的表示是唯一的。而补码正好解决了这个问题,当-127的补码和-1的补码相加时得到的补码正好是在原码表示下的负零,于是我们将这个数值成为-128扩充了一位。这样解决了,计算的效率问题,也解决了零编码的唯一性问题,还增加了数值存储的范围。

    补码如何转成原码

    符号位不动,其他位求反,最后整个数加一,得到原码

    -2的补码是:1111 1110
    原码是:1000 0010;

    相关文章

      网友评论

        本文标题: 原码、反码、补码

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