Как преобразовать отрицательное целочисленное значение в hex в python
Я использую python 2.6
>>> hex(-199703103)
'-0xbe73a3f'
>>> hex(199703103)
'0xbe73a3f'
Положительное и отрицательное значение одинаковы?
Когда я использую calc, значение FFFFFFFFF418C5C1
.
Ответы
Ответ 1
Целочисленные числа Python могут расти сколь угодно большими. Чтобы вычислить необработанный two's-supplement так, как вам нужно, вам нужно указать желаемую ширину бита. Ваш пример показывает -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
Ответ 2
Поскольку целые числа 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
Ответ 3
>>> import struct
>>> struct.pack("i", -4)
'\xfc\xff\xff\xff'