36

我使用 python 2.6

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

>>> hex(199703103)
'0xbe73a3f'

正负值是一样的吗?

当我使用 calc 时,值为FFFFFFFFF418C5C1.

4

4 回答 4

62

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
于 2011-10-19T14:40:13.997 回答
21

因为 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
于 2011-10-19T17:26:43.870 回答
2

添加到标记答案,如果您想要不同的输出格式,请使用

'{:X}'.format(-199703103 & (2**32-1))
于 2018-05-11T13:12:48.030 回答
0

对于那些想要正数前导零的人,试试这个:

val = 42
nbits = 16
'{:04X}'.format(val & ((1 << nbits)-1))

在此处输入图像描述

谢谢@tm1,给我灵感!

于 2021-10-25T22:17:40.813 回答