请问这3个有符号4位十六进制数转换为十进制数如何算?

为什么十六进制数FC34化为十进制是-972?为什么十六进制数C0C0化为十进制数是-16192?为什么十六进制数FFFF化为十进制数是-1?
关注者
6
被浏览
7,041

2 个回答

首先,你要了解bit和B,十进制、二进制、十六进制以及它们之间互相转换的方法,在此我不作介绍。然后你要了解有符号整数的存储原理、反码、补码,在此我作一定的介绍。

有符号的数,第一bit是符号位,符号位0表示正数(包括0),符号位1表示负数。

4位16进制数也就是4*4bit=2B的大小。我这里用8bit=1B的整数来列表,以便于观察:

有符号8bit和十进制原数的对应关系

符号位为0时,去掉符号位,剩下的7bit就表示原数,这个很简单。

符号位为1时,为什么要这么排下去呢?这是为了便于运算。举个例子:-1+1用8bit数计算为1111,1111+0000,0001=1,0000,0000溢出,直接截断得到0000,0000,这样计算就很方便了。

符号位为1时,计算原数也有巧妙的方法。原数的绝对值大小,就是它离0000,0000的距离,也就是离1111,1111的距离+1. 离1111,1111的距离非常好算,每一位取反就可以了,这个叫 取反码 。进一步,称“取反码再+1”为 取补码 。举例:

求1011,0111的值:符号位为1表示负数,取补码,即

补码(1011,0111)=反码(1011,0111)+1

=0100,1000+1=0100,1001=2^6+2^3+2^0=73

所以1011,0111表示-73.

上述过程的原理是1011,0111+0100,1000+1=1111,1111+1=0000,0000,意味着1011,0111和0000,0000的距离是0100,1001.


FC34符号位1表示负数,反码为03CB,补码为03CC,原数为

-(3\times16^2+12\times16+12)=-972

C0C0符号位1表示负数,反码为3F3F,补码为3F40,原数为

-(3\times16^3+15\times16^2+4\times16)=-16192

最后一个你自己看。

首先这里指的十六进制数应该是16位的,这样才是有符号的十六进制数.

其次,按补码规则,负数按位取反+1=负数绝对值.

下面用的是win10自带计算器:

切换一下DWORD这里,就会在DEC(十进制)那里出现了-972.

根据上面的补码规则,负数按位取反+1=绝对值,因此各个点击一下取反.

971+1=负数-972的绝对值,所以FC34表示-972.

同样的,C0C0:

取反+1验证:

16191+1 = |-16192|.

下面是FFFF:

这个就不用取反验证了吧...因为全是1,取反是0.

0+1=1=|-1|.

其实这里只是用了一点补码的知识,推荐可以看一下: