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