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)
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)