如何在python中将负整数值转换为十六进制

时间:2011-10-19 14:35:10

标签: python integer hex negative-number

我使用python 2.6

>>> hex(-199703103)
'-0xbe73a3f'

>>> hex(199703103)
'0xbe73a3f'

正负值是否相同?

当我使用calc时,值为FFFFFFFFF418C5C1

4 个答案:

答案 0 :(得分:40)

Python的整数可以任意增长。为了按照您希望的方式计算原始two's-complement,您需要指定所需的位宽。您的示例以64位二进制补码显示-199703103,但它也可以是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

答案 1 :(得分:9)

因为Python整数是任意大的,所以你必须屏蔽这些值以限制转换为2s补码表示所需的位数。

>>> hex(-199703103 & (2**32-1)) # 32-bit
'0xf418c5c1L'
>>> hex(-199703103 & (2**64-1)) # 64-bit
'0xfffffffff418c5c1L'

Python将hex(-199703103)的简单大小写显示为负十六进制值(-0xbe73a3f),因为对于任意精度数,2s补码表示在其前面将具有无限数量的Fs。掩码值(2 ** 32-1 == 0xFFFFFFFF)限制了这个:

FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
&                             FFFFFFFF
--------------------------------------
                              F418c5c1

答案 2 :(得分:1)

添加到Marks answer,如果您想要不同的输出格式,请使用

'{:X}'.format(-199703103 & (2**32-1))

答案 3 :(得分:-2)

>>> import struct
>>> struct.pack("i", -4)
'\xfc\xff\xff\xff'