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

nic*_*nic 25 python hex integer negative-number

我使用python 2.6

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

>>> hex(199703103)
'0xbe73a3f'
Run Code Online (Sandbox Code Playgroud)

正负值是一样的吗?

当我使用calc时,值为FFFFFFFFF418C5C1.

NPE*_*NPE 47

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)
Run Code Online (Sandbox Code Playgroud)

打印出:

0xfffffffff418c5c1L
0xbe73a3fL
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下当你添加`(1&lt;&lt;64)`时发生了什么吗?为什么需要这样做? (2认同)
  • @jathanism,值`(1 &lt;&lt; 64)`比适合64位整数的值大1。只要负数适合64位,将其加到负数将使其变为正数。如果原始数字为正,则%将撤消加法的影响。 (2认同)

Mar*_*nen 12

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

>>> hex(-199703103 & (2**32-1)) # 32-bit
'0xf418c5c1L'
>>> hex(-199703103 & (2**64-1)) # 64-bit
'0xfffffffff418c5c1L'
Run Code Online (Sandbox Code Playgroud)

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

FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
&                             FFFFFFFF
--------------------------------------
                              F418c5c1
Run Code Online (Sandbox Code Playgroud)

  • @swdev,`py -m timeit"2**32-1"` - > 0.0235 usec per loop,`py -m timeit"2 << 32-1"` - > 0.0235 usec per loop.不要假设.总是测量你是否关心:)很可能Python字节编译器生成相同的加载常量. (2认同)