как преобразовать отрицательное целочисленное значение в hex в python

Я использую python 2.6

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

>>> hex(199703103)
'0xbe73a3f'

положительное и отрицательное значение одинаковы?

когда я использую calc, значение FFFFFFFFF418C5C1.

4 ответов


целые числа 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)

Это печатает out:

0xfffffffff418c5c1L
0xbe73a3fL

поскольку целые числа Python произвольно велики, вам нужно замаскировать значения, чтобы ограничить преобразование количеством битов, которые вы хотите для вашего представления дополнения 2s.

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

Python отображает простой случай hex(-199703103) как отрицательное значение hex (-0xbe73a3f), потому что представление дополнения 2s будет иметь бесконечное число Fs перед ним для произвольного числа точности. Значение маски (2* * 32-1 == 0xFFFFFFFF) ограничивает это:

FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
&                             FFFFFFFF
--------------------------------------
                              F418c5c1

добавлять к знаки ответа, Если вы хотите другой формат, используйте

'{:X}'.format(-199703103 & (2**32-1))

>>> import struct
>>> struct.pack("i", -4)
'\xfc\xff\xff\xff'