补码的意义

来源:互联网 发布:国外域名购买十年 编辑:程序博客网 时间:2024/05/17 22:03

       计算机中CPU内运算器应该是用ACC来完成加减法运算的。但是Accumulator怎么完成减法运算呢?唐朔飞的教材中这样描述了补码的诞生。

       为了用ACC计算加减法,那么对真值进行了分类,用前加0/1区别正负,形成了原码。为了完成减法运算产生了补码+反码。移位是为了区别大小。

那么为什么这样定义补码呢?我不禁疑惑,原码对真值的区间定义是[0,2^n),(-2^n,0],和小数的[0,1),(-1,0]这样的定义才产生了正负0真值的原码不一致的情况,因为原本是断点函数。那么补码为什么定义的区间是[-2^n,0),[0,2^n),和小数的[0,1),[-1,0)呢?这样定义有什么好处呢?

       如果说补码是这样定义的,是因为和真值的mod 2^n+1而自然而然形成的。那么又出现了疑问,反码的定义。很明显,反码的区间(-2^n,0],[0,2^n),和小数的[0,1),(-1,0]是和原码对应的。而且由唐的教材可以知道,反码也是为了用ACC进行减法运算,遇到的细化问题而诞生的。从唐的书上描述,它是补码-末尾的1。它和真值也是mod 2^n-1或者小数mod 2-2^(-n)。且计算中有这个规律,补码=符号位+原码,除去符号位,取反(反码的定义)+末尾1,原码=符号位+补码,除去符号位,取反+末尾1。

       按照唐朔飞的书描述,逻辑应该是从原码推到补码再到反码。如果是这样,应该是原码、补码的定义一样,到反码,出现矛盾的时候再纠正定义,但是明显没有这样。这里我思考下,感觉有点不太对。按照上述的规律,和定义,原码应该是和反码对应的,补码才是另外产生的。

       所以,大胆猜想,反码的出现意义应该是大于补码的,是因为反码才出现补码。这样的话,原码,反码定义区间一样,定义以后,为了从原码推到反码,从而定义了另外一个补码。这样的话,逻辑就合理了。因为真值是+-0的话,原码显然+-0的真值对应的[+-0]原 都不一样。同样,对应的反码也是不一样的。

抽出整数公式看看:

[+0]原=0,0

[-0]原=2^n-0=2^n=1,000000,n个0

[+0]反=0,0

[-0]反=2^(n+1)-1+0=2^(n+1)-1=1,00000```0-0```000001=11```11111,n+1个1


       吃了个饭回来,又想了想,原码出现这个定义是很自然的。因为如果把+/-用开头的0/1表示的话,那么一定会出现0对应两个值。这么说,反码很可能就是因为这个而定义的+-0,为了满足   反码+末位1=原码,-0的反码定义解决了。那么+0的反码定义呢?正数中反码+补码+原码一样。

       找到了http://blog.csdn.net/jiange_zh/article/details/47381115,发现了公开课中描述关于使用补码,是为了得到负数。所以正数不需要重新定义,他们正确执行加法就行了。对于减法,则看成正数和负数相加。把负数表达成补码这种的形式(正数的相反数,即相加为(1)0···000)。

       



删掉了一些原来写的,现在看来当时的理解还有误差。

       补码是为了得到负数而设置的,利用的是mod 可以产生的负数与正数相等。所以只要有补码的存在,必须满足有mod 2^n+1才可以。这样的话,-0的补码等于+0的补码也就解释得通了,是因为满足mod的规则,所以在-0的补码=(1),00000的时候1产生了溢出,满足mod 2^n+1自动消去了,然后才在最后的-2^n定义里补充了这一个数,从而使得数有对应关系。

       其实唐的教材在反码的地方有一个错误,她认为反码中有mod 2-2^-n存在,可以这样理解。但实际上是不存在的,因为如果存在,那么就是会使得-0的反码溢出,导致-0的反码和+0的反码相等,这和定义不符,反码应该是和原码定义对应的。整数部分也一样。当然由于现代计算机都是用补码进行的计算,所以,基本都有mod规则存在。




原创粉丝点击