Печать отрицательных значений в виде шестнадцатеричного значения в python

У меня есть следующий фрагмент кода на С++:

for (int x = -4; x < 5; ++x)
       printf("hex x %d 0x%08X\n", x, x);

И его выход

hex x -4 0xFFFFFFFC
hex x -3 0xFFFFFFFD
hex x -2 0xFFFFFFFE
hex x -1 0xFFFFFFFF
hex x 0 0x00000000
hex x 1 0x00000001
hex x 2 0x00000002
hex x 3 0x00000003
hex x 4 0x00000004

Если я попробую то же самое в python:

for x in range(-4,5):
   print "hex x", x, hex(x)

я получаю следующее

hex x -4 -0x4
hex x -3 -0x3
hex x -2 -0x2
hex x -1 -0x1
hex x 0 0x0
hex x 1 0x1
hex x 2 0x2
hex x 3 0x3
hex x 4 0x4

Или это:

for x in range(-4,5):
   print "hex x %d 0x%08X" % (x,x)

Который дает:

hex x -4 0x-0000004
hex x -3 0x-0000003
hex x -2 0x-0000002
hex x -1 0x-0000001
hex x 0 0x00000000
hex x 1 0x00000001
hex x 2 0x00000002
hex x 3 0x00000003
hex x 4 0x00000004

Это не то, что я ожидал. Есть ли какой-то трюк форматирования, который я упустил, который превратит -4 в 0xFFFFFFFC вместо -0x04?


person grieve    schedule 30.09.2010    source источник


Ответы (1)


Вам нужно явно ограничить целое число до 32 бит:

for x in range(-4,5):
   print "hex x %d 0x%08X" % (x, x & 0xffffffff)
person kennytm    schedule 30.09.2010
comment
Чтобы инвертировать: h = int(s, 16); s, n = h ›› 31, h & 0x7ffffffff; вернуть n, если не s, иначе (-0x80000000 + n) - person David Fraser; 20.05.2011
comment
Для более чем 32 бит используйте hex(x + 16**number_of_hex_digits). Например, x=-9999999999 из 40 шестнадцатеричных цифр становится 0xfffffffffffffffffffffffffffffffdabf41c01L. - person Bob Stein; 06.03.2015