补码的计算原理(另附:原码、反码、补码如何产生的)

来源:互联网 发布:手机淘宝 没有链接 编辑:程序博客网 时间:2024/04/30 06:27

计算机中,所有的数都是以补码形式存在的,而所谓的加减运算也只是补码间的加法运算。而在我们初学二进制编码的时候,一般会看到如下的描述:

原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。

反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。

补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。


虽然明白了它是怎么计算的,但我一直想弄懂到底为什么会这样计算,补码为什么会有如此奇怪的运算规则。


这个问题困扰了好久,后来无意间看到的一篇文章,让我对补码的来历以及运算有了新的理解。

总结为大致四点:

  • 计算机里面,只有加法器,没有减法器,所有的减法运算,都必须用加法进行。
  • 用补数代替原数,可把减法转变为加法。出现的进位就是模,此时的进位,就应该忽略不计。
  • 二进制下,有多少位数参加运算,模就是在 1 的后面加上多少个 0。
  • 补码就是按照这个要求来定义的:正数不变,负数即用模减去绝对值。

  • 因此,得到了补码计算的新的方法:正数的补码为其本身,负数的补码为“模”减去其绝对值。
    以-128为例,则-128的补码可以看作——“模”-abs(-128),即:
    100000000-10000000=10000000

    至于,为什么会有补码等于反码加一这样的运算法,可以按如下推导:
     100000000-10000000
    =(011111111+000000001)-10000000
    =11111111-10000000+1                                                   //原码前边的0舍去了
    =反码+1

    如此如此,补码也就不再难以理解了。


    PS:正所谓集思广益,取长补短,好的东西就应该发扬,以便更多人知道,特在此引用别人的观点并加以补充——“原码,反码,补码的产生之路以及其优缺点”


    数字在自然界中抽象出来的时候,一棵树,两只猪,是没有正数和负数的概念的

    计算机保存最原始的数字,也是没有正和负的数字,叫“无符号数字

    如果我们在内存分配4位(bit)去存放无符号数字,是下面这样子的

    后来在生活中为了表示“欠别人钱”这个概念,就从无符号数中,划分出了“正数”和“负数”

    正如上帝一挥手,从混沌中划分了“白天”与“黑夜”

    为了表示正与负,人们发明了"原码",把生活应该有的正负概念,原原本本的表示出来

    把左边第一位腾出位置,存放符号,正用0来表示,负用1来表示

    但使用“原码”储存的方式,方便了看的人类,却苦了计算机

    我们希望 (+1)和(-1)相加是0,但计算机只能算出0001+1001=1010 (-2)

    这不是我们想要的结果 (╯' - ')╯︵ ┻━┻

    另外一个问题,这里有一个(+0)和(-0)

    为了解决“正负相加等于0”的问题,在“原码”的基础上,人们发明了“反码

    “反码”表示方式是用来处理负数的,符号位置不变,其余位置相反

    当“原码”变成“反码”时,完美的解决了“正负相加等于0”的问题

    过去的(+1)和(-1)相加,变成了0001+1110=1111,刚好反码表示方式中,1111象征-0

    人们总是进益求精,历史遗留下来的问题—— 有两个零存在,+0 和 -0

    我们希望只有一个0,所以发明了"补码",同样是针对"负数"做处理的

    "补码"的意思是,从原来"反码"的基础上,补充一个新的代码,(+1)

    我们的目标是,没有蛀牙(-0)
    有得必有失,在补一位1的时候,要丢掉最高位

    我们要处理"反码"中的"-0",当1111再补上一个1之后,变成了10000,丢掉最高位就是0000,刚好和左边正数的0,完美融合掉了

    这样就解决了+0和-0同时存在的问题

    另外"正负数相加等于0"的问题,同样得到满足

    举例,3和(-3)相加,0011 + 1101 =10000,丢掉最高位,就是0000(0)

    失之东隅,收之桑榆。我们失去了(-0) , 收获了(-8)

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    至此,从原码到反码,再从反码到补码,最终取最优的解决方案,即:计算机中的数采用补码来表示。




    1 0