我使用 python 2.6
>>> hex(-199703103)
'-0xbe73a3f'
>>> hex(199703103)
'0xbe73a3f'
正负值是一样的吗?
当我使用 calc 时,值为FFFFFFFFF418C5C1
.
我使用 python 2.6
>>> hex(-199703103)
'-0xbe73a3f'
>>> hex(199703103)
'0xbe73a3f'
正负值是一样的吗?
当我使用 calc 时,值为FFFFFFFFF418C5C1
.
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
因为 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
添加到标记答案,如果您想要不同的输出格式,请使用
'{:X}'.format(-199703103 & (2**32-1))