一、当我们使用Python进行十六进制数据转换十进制数据时,因为可能存在有符号情况下正负值的问题,所以在转换时要特别留意加以区分。
无符号:从0000 0000(0)到1111 1111(2^8-1=255)。
有符号:有一位表示符号位(1表示负,0表示正)正数从0 000 0000(0)到 0 111 1111(2^7-1=127,第一位0表示正)。负数:从1 000 0000到1 111 1111(-(2^7-1)=-127)。
负数在计算机中用补码表示-0的补码为0000 0000与+0的表示一致,所以用0000 0000表示+0和-0。所以1 000 0000不表示-0而表示-128。
二、在实际使用的过程中,负数直接就是一个十六进制数,并没有带符号,以单字节举例:
实际的单字节十六进制有符号情况下,最大值是在7F,所以当单字节十六进制数大于7F时,便是负值。这时按照 0xFF - x + 0x01 的计算公式,将其转换为十进制数值。
例:
# 正数
a = 0x64
print("0x64的正十进制:" + a)
#负
b = 0x9C
b = 0xFF - b + 0x01
print("0x9C的负十进制:" + b)
#输出
#0x64的正十进制:100
#0x9C的负十进制:-100