2013-06-02 60 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,它等于将它打印为无符号的十六进制数字)。这两个数字在二进制补码算法中具有相同的二进制表示,尽管它们在数值上不相等。这就是为什么在有符号值和无符号值之间进行比较是一个坏主意。