为什么地址号在十进制和十六进制中不相等?

时间:2013-06-02 00:34:16

标签: c

debian@debian:~$ cat  /tmp/test.c
#include<stdio.h> 
int  main(void)
{
 int m=1;
 printf("m=%d\n",&m);
 printf("m=%p\n",&m);
}
debian@debian:~$ gcc  /tmp/test.c -o  /tmp/test.exe
debian@debian:~$ /tmp/test.exe
m=-1078061268
m=0xbfbe172c
debian@debian:~$ 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

为什么dec中的-1078061268与十六进制中的0xbfbe172c不相等?

3 个答案:

答案 0 :(得分:1)

是的。在2的补充。

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

地址不是int。如果你的机器是32位,那么它是一个unsigned int(事实上,uint32_t)。如果没有,则为uint64_t。将它放在uintptr_t中并使用%p打印出来总是安全的。

答案 1 :(得分:1)

它们是相同的,您将签名与无符号进行比较。

以格式查看here

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

答案 2 :(得分:1)

第一个printf语句将地址视为有符号整数。第二个是处理它是一个指针(对于printf,它相当于将其打印为无符号十六进制数)。这两个数字在二进制补码算法中具有相同的二进制表示,尽管它们在数值上不相等。这就是为什么在有符号值和无符号值之间进行比较是个坏主意。