我使用python 2.6
>>> hex(-199703103)
'-0xbe73a3f'
>>> hex(199703103)
'0xbe73a3f'
正负值是否相同?
当我使用calc时,值为FFFFFFFFF418C5C1
。
答案 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'