2010-09-30 96 views
7

六角我在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?

回答

15

需要將整數明確地限制到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;如果不是,則返回n(-0x80000000 + n) – 2011-05-20 15:38:11

+1

對於超過32位,使用'hex(x + 16 ** number_of_hex_digits)'。例如,x = -9999999999的40位十六進制數字變成了「0xfffffffffffffffffffffffffffffffdabf41c01L' – 2015-03-06 14:29:04