2013-06-02 62 views
0
[email protected]:~$ cat /tmp/test.c 
#include<stdio.h> 
int main(void) 
{ 
int m=1; 
printf("m=%d\n",&m); 
printf("m=%p\n",&m); 
} 
[email protected]:~$ gcc /tmp/test.c -o /tmp/test.exe 
[email protected]:~$ /tmp/test.exe 
m=-1078061268 
m=0xbfbe172c 
[email protected]:~$ python 
Python 2.7.3 (default, Jan 2 2013, 16:53:07) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print hex(-1078061268) 
-0x4041e8d4 

爲什麼-1078061268在dec中不等於0xbfbe172c in hex?爲什麼地址編號在十進制和十六進制中不相等?

+0

這些數字是相等的。由於sign屬性和不同的基數(16 vs 10),十六進制值看起來與unsigned int不同。 – tay10r

+0

除了識別十進制與十六進制模式的問題之外,還存在更嚴重的問題。永遠不要使用'%d'打印指針。整數和指針通常具有不同的寬度,所以'printf'會嚴重混淆它的參數,導致程序崩潰。 –

回答

1

他們是一樣的,你正在比較簽名與無符號。

看看格式的here

#include<stdio.h> 
int main(void) 
{ 
    int m=1; 
    printf("m=%u\n",&m); // 3219008780 
    printf("m=%p\n",&m); // 0xbfde2d0c 
} 
1

它是。在2的補碼。

>>> hex(2**32-1078061268) 
'0xbfbe172c' 

地址不是int。如果你的機器是32位的,它是一個無符號的int(實際上,uint32_t)。如果不是,它是一個uint64_t。將它放在uintptr_t中始終是安全的,並用%p打印。

1

第一個printf語句處理該地址是一個符號整數。第二種是將它作爲一個指針(對於printf,它等於將它打印爲無符號的十六進制數字)。這兩個數字在二進制補碼算法中具有相同的二進制表示,儘管它們在數值上不相等。這就是爲什麼在有符號值和無符號值之間進行比較是一個壞主意。