在Python中将负值以十六进制形式打印

9

我有以下C++代码片段:

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?
1个回答

19
您需要明确将整数限制在32位:
for x in range(-4,5):
   print "hex x %d 0x%08X" % (x, x & 0xffffffff)

1
反转操作:h = int(s, 16); s, n = h >> 31, h & 0x7fffffff; 如果s为假,则返回n,否则返回(-0x80000000 + n)。 - David Fraser
1
对于超过32位的情况,请使用 hex(x + 16 ** number_of_hex_digits)。例如,当x=-9999999999且有40个十六进制数字时,得到的结果为0xfffffffffffffffffffffffffffffffdabf41c01L - Bob Stein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接