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
不相等?
答案 0 :(得分:1)
>>> 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,它相当于将其打印为无符号十六进制数)。这两个数字在二进制补码算法中具有相同的二进制表示,尽管它们在数值上不相等。这就是为什么在有符号值和无符号值之间进行比较是个坏主意。