posts - 8,  comments - 4,  trackbacks - 0

为了在计算机中表示负数,有一些编码方式添加了符号位来区别正整数与负整数。

可是,这样一来,整数的加减运算变复杂了。

 

事实上,整数是一个整体,用符号位来区分正整数与负整数好像没什么必要。

 

补码的思想可能是这样来的——补码可以看成是一种编码方式,在这种编码方式中,正整数的表示方法跟无符号数相同是很自然的,可是负数怎么办呢?

为了简化这种编码方式的加减运算,可以考虑把整数的减法[x]-[y]转换成加法[x]+[-y],用一个加法器来进行所有的加减运算,这里其实给出了负数的编码方法——如果这种运算方法是可行的,就会有[x]+[-x]=[0],即可以用正数来定义负数。

假定用4位二进制来编码,由于[0010]+[1110]=[0000],于是-2的编码是[1110]。类似的,可以给出其余负数的编码。

 

整理一下思路,以这样方式进行编码(8-bits)

正整数与无符号数的编码相同(0~2^7-1)

0与正整数(1~2^7)的编码来定义负整数的编码,使得[x]+[-x]=[0]

由负整数的定义可以看出,负数的编码是唯一的,同时值在2^7~2^8之间。

x取反加1再加上自己,结果为0x取反加1是唯一的,又由负整数的定义,负整数的编码一定是存在的,于是x取反加1就是负整数的编码。

 

证明这种编码的减法可以转换成加法

[x]-[y]=[x]-[y]+[0]=[x]+([0]-[y])=[x]+[-y]

 

证明对任何整数xy[x]+[y]=[x+y]

(i)如果x>0,y>0,[x]+[y]=[x+y]

(ii)如果x<0,y>0,x+y>=0,[x]+[y]=[x]+[(x+y)+(-x)] =[x]+[x+y]+[-x]=[x+y](i)

(iii)如果x<0,y>0,x+y<0,[x]+[y]= [x]+[(x+y)+(-x)]= [x]+[x+y]+[-x]=[x+y](ii)

(iiii)如果x<0,y<0,[x]+[y]= [x]+[(x+y)+(-x)]= [x]+[x+y]+[-x]=[x+y](iii)

 

参考http://www.ruanyifeng.com/blog/2009/08/twos_complement.html

posted on 2011-09-18 01:23 leafcore 阅读(2016) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



常用链接

留言簿

文章分类(2)

交流与思索

让生活更轻松

最新评论

阅读排行榜