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

41 投票
4 回答
48372 浏览
提问于 2025-04-17 04:37

我用的是 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

撰写回答