36

私はpython 2.6を使用しています

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

>>> hex(199703103)
'0xbe73a3f'

正と負の値は同じですか?

calc を使用すると、値はFFFFFFFFF418C5C1.

4

4 に答える 4

62

Python の整数は、任意に大きくなる可能性があります。生の2 の補数を希望どおりに計算するには、目的のビット幅を指定する必要があります。あなたの例は-19970310364ビットの2の補数で示されていますが、32ビットまたは128ビットでも同様に可能であり、最初の0xf's の数が異なります。

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 の整数は任意に大きいため、値をマスクして、変換を 2 の補数表現に必要なビット数に制限する必要があります。

>>> hex(-199703103 & (2**32-1)) # 32-bit
'0xf418c5c1L'
>>> hex(-199703103 & (2**64-1)) # 64-bit
'0xfffffffff418c5c1L'

Python は、単純なケースをhex(-199703103)負の 16 進数値 ( -0xbe73a3f) として表示します。これは、2 の補数表現では、任意の精度の数値の前に無限の数の F があるためです。マスク値 (2**32-1 == 0xFFFFFFFF) はこれを制限します。

FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
&                             FFFFFFFF
--------------------------------------
                              F418c5c1
于 2011-10-19T17:26:43.870 に答える