如何在Python中将负整数转换为十六进制
我用的是 Python 2.6
>>> hex(-199703103)
'-0xbe73a3f'
>>> hex(199703103)
'0xbe73a3f'
正值和负值是一样的吗?
当我使用 calc 时,得到的值是 FFFFFFFFF418C5C1
。
4 个回答
2
补充一下Mark的回答,如果你想要不同的输出格式,可以使用下面的代码:
'{:X}'.format(-199703103 & (2**32-1))
22
因为Python中的整数可以非常大,所以你需要对这些值进行处理,以限制它们转换成你想要的位数,特别是对于二进制补码表示法。
>>> hex(-199703103 & (2**32-1)) # 32-bit
'0xf418c5c1L'
>>> hex(-199703103 & (2**64-1)) # 64-bit
'0xfffffffff418c5c1L'
在Python中,当你简单地输入 hex(-199703103)
时,它会显示为一个负的十六进制值 (-0xbe73a3f
)。这是因为如果用二进制补码表示的话,前面会有无数个F,特别是对于任意精度的数字。为了限制这个情况,我们使用一个掩码值(2**32-1 == 0xFFFFFFFF):
FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
& FFFFFFFF
--------------------------------------
F418c5c1
71
Python中的整数可以无限大。为了按照你想要的方式计算原始的二进制补码,你需要指定想要的位数。你给的例子是将-199703103
表示为64位的二进制补码,但它也可以是32位或128位,这样开头的0xf
的数量就会不同。
hex()
函数并不能做到这一点。我建议你试试下面的方法:
def tohex(val, nbits):
return hex((val + (1 << nbits)) % (1 << nbits))
print tohex(-199703103, 64)
print tohex(199703103, 64)
这样输出的结果是:
0xfffffffff418c5c1L
0xbe73a3fL