负数十六进制与十进制如何相互转换?-负数十六进制补码怎么算

2023-05-12 12:17:44

 

这个问题的题目应该改为「补码和原码之前如何互相转换」比较恰当。但是很多人对补码的认识都有这样的误区,所以还是保留下来吧。

我们都知道,1d(十进制,下同)=1h(十六进制,下同),127d=7fh,255d=ffh。那么如果表示负数该如何表示呢,答案说出来基本属于被折叠的那种,-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

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


以上就是关于《负数十六进制与十进制如何相互转换?-负数十六进制补码怎么算》的全部内容,本文网址:https://www.7ca.cn/baike/32658.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明