计算机中的原码和补码的相互转换

4030阅读 0评论2014-04-12 shaohui973
分类:C/C++

1d(十进制,下同)=1h(十六进制,下同),127d=7fh,255d=ffh。

计 算机的世界过于简单。在计算机里,没有负数和浮点数,数只有一种,就是整数,而且是无符号整数,而且还是有范围的。其他任何的数,都必须靠这一点点无符号 整数来表示。我们都知道,计算机里面用二进制存储,那么,如果用n个二进制位来存储一个数的话,这个数能表示的范围就是0到2^n-1。当然,我们希望能 够表示负数,所以计算机科学家们发明了补码(除了补码,还有其他表示负数的方法)。

我们以8位整数来举例。在计算机里面,科学家们希望用最高位来表示符号,这样子,数轴就会被分割成两段,0d-127d和128d-255d。补码里面,把红色那一段移动到负数的部分,用来表示负数,也就是说,补码是「用255d(FFh)来表示-1d」,而不是说「FFh是-1d」


根据上面这个图,-1d的8位补码是255d(FFh),-128d的8位补码是128d(80h),我们很容易可以得出,x(x<0)的n位补码是2^n+x。也就是说,如果b是a的n位补码,那么应该有a+b=2^n。

讲到这里,我需要插一段,讲讲怎么样按位取反。我们假设n位的整数a和b互为反码,那么显然有a+b=2^n-1,所以对a按位取反,计算方法就是b=2^n-a-1

好了,我们再把刚刚我们得到的补码的公式拿过来,是不是可以变成2^n+x-1+1 => [2^n - (-x) -1]+ 1,也就是说,如果我们可以先把这个(负)数的绝对值(即-x)取反,再加一,这样就能得到x的补码了。

然后,我们整理一下这个等式,令求得的补码为p:
[2^n - (-x) -1] +1 = p
[2^n - p -1] +1 = x
上式说明子,我们就可以通过先取反,再加一的方法,求得补码p所表示的数x。

其实,你也可以按照你原来的方法,一步一步返回去,即先减一,再取反,这样子能得到的是所表示的负数的绝对值,公式也很简单:
[2^n - (-x) -1] +1 = p
2^n - (-x) -1 = p -1
2^x - (p-1) -1 = -x

最后,说明一点,我们常常有一个误区,求补码时所说的取反加一,是对负数的绝对值取反,然后加一。所以返回的时候,没有想当然的变成减一。如果要变成减一,那么取反和减的顺序也应该做调整,这样子就是上面讲的那个方法了。
上一篇:web server大全之GoAhead移植
下一篇:##和#