为了在计算机中表示负数,有一些编码方式添加了符号位来区别正整数与负整数。
可是,这样一来,整数的加减运算变复杂了。
事实上,整数是一个整体,用符号位来区分正整数与负整数好像没什么必要。
补码的思想可能是这样来的——补码可以看成是一种编码方式,在这种编码方式中,正整数的表示方法跟无符号数相同是很自然的,可是负数怎么办呢?
为了简化这种编码方式的加减运算,可以考虑把整数的减法[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再加上自己,结果为0。x取反加1是唯一的,又由负整数的定义,负整数的编码一定是存在的,于是x取反加1就是负整数的编码。
证明这种编码的减法可以转换成加法
[x]-[y]=[x]-[y]+[0]=[x]+([0]-[y])=[x]+[-y]
证明对任何整数x与y有[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 阅读(2180)
评论(0) 编辑 收藏 引用