私はpython 2.6を使用しています
>>> hex(-199703103)
'-0xbe73a3f'
>>> hex(199703103)
'0xbe73a3f'
正と負の値は同じですか?
calc を使用すると、値はFFFFFFFFF418C5C1
.
私はpython 2.6を使用しています
>>> hex(-199703103)
'-0xbe73a3f'
>>> hex(199703103)
'0xbe73a3f'
正と負の値は同じですか?
calc を使用すると、値はFFFFFFFFF418C5C1
.
Python の整数は、任意に大きくなる可能性があります。生の2 の補数を希望どおりに計算するには、目的のビット幅を指定する必要があります。あなたの例は-199703103
64ビットの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
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