当前位置:编程学习 > C/C++ >>

补码的简单探究

为了在计算机中表示负整数,有一些编码方式添加了符号位来区别正整数与负整数。
可是,这样一来,整数的加减运算变复杂了。


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

补码的思想可能是这样来的——补码可以看成是一种编码方式,在这种编码方式中,正整数的表示方法跟无符号数相同是很自然的,可是负数怎么办呢?
为了简化这种编码方式的加减运算,可以考虑把整数的减法x-y转换成加法x+(-y),用一个加法器来进行所有的加减运算,这里其实给出了负数的编码方法——如果这种运算方法是可行的,就会有x+(-x)=0,即可以用正数来定义负数。
假定用4位二进制来编码,由于0010+1110=0000,于是-2的编码是1110。类似的,可以给出其余负数的编码。

 

整理一下思路,以这样的方式进行编码(8-bits)。
1)      正整数与无符号数的编码相同(0~2^7-1)
2)      用0与正整数(1~2^7)的编码来定义负整数的编码,使得x+(-x)=0
由负整数的定义可以看出,负数的编码是唯一的,同时值在2^7~2^8之间。
若x取反加1再加上自己,结果为0。x取反加1是唯一的,又由负整数的定义,负整数的编码一定是存在的,于是x取反加1就是负整数的编码。

 

可以证明这种编码的加减运算可以用一个加法器实现。
假定有两个正整数x与y(运算结果不溢出)。
1)      x+y=x+y可以得到正确的结果
2)      x+(-y),分类讨论
   a)         若x>y,由1)可以使x=y+(x-y),于是x+(-y)=(y+(x-y))+(-y)=(y+(-y))+ (x-y)= (x-y),可以得到正确结果
   b)        若x<y,由a)可以使x=y+(-(y-x)),于是x+(-y)=(y+(-(y-x)))+(-y)=(y+(-y))+ (-(y-x))= (-(y-x)),可以得到正确结果
3)      (-x)+(-y),由b)可以使 (-x)=y+(-(x+y)),于是(-x)+(-y)=(y+(-(x+y)))+(-y)=(y+(-y))+(-(x+y))=(-(x+y)),可以得到正确结果

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,