Chinaunix首页 | 论坛 | 博客
  • 博客访问: 752436
  • 博文数量: 215
  • 博客积分: 291
  • 博客等级: 二等列兵
  • 技术积分: 1031
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-12 18:17
文章分类

全部博文(215)

文章存档

2016年(16)

2015年(16)

2014年(123)

2013年(60)

分类: C/C++

2014-04-12 11:29:06

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

最后,说明一点,我们常常有一个误区,求补码时所说的取反加一,是对负数的绝对值取反,然后加一。所以返回的时候,没有想当然的变成减一。如果要变成减一,那么取反和减的顺序也应该做调整,这样子就是上面讲的那个方法了。
阅读(3881) | 评论(0) | 转发(0) |
0

上一篇:web server大全之GoAhead移植

下一篇:##和#

给主人留下些什么吧!~~