十六进制数据转换十进制时区别正负值(Python)
一、当我们使用Python进行十六进制数据转换十进制数据时,因为可能存在有符号情况下正负值的问题,所以在转换时要特别留意加以区分。
- 1、单字节(无符号):0到255;(有符号):-128到127。
- 2、双字节(无符号):0到65535;(有符号):-32768到32765。
- 3、四字节(无符号):0到4294967295;(有符号):-2147483648到2147483647。
无符号:从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 的计算公式,将其转换为十进制数值。
例:
1 # 正数 2 a = 0x64 3 print("0x64的正十进制:" + a) 4 5 #负 6 b = 0x9C 7 b = 0xFF - b + 0x01 8 print("0x9C的负十进制:" + b) 9 10 #输出 11 #0x64的正十进制:100 12 #0x9C的负十进制:-100