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

debian@debian:~$ cat /tmp/test.c #include 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不等于hex的0xbfbe172c

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

看看这些格式。

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

它是。 在2的补充。

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

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

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