0
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

为什么-1078061268in dec 不等于0xbfbe172c十六进制?

4

3 回答 3

1

它是。在 2 的补码中。

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

地址不是整数。如果你的机器是 32 位的,它是一个无符号整数(实际上是uint32_t)。如果不是,它是一个uint64_t. 将它放在 中总是安全的uintptr_t,然后用%p.

于 2013-06-02T00:40:23.547 回答
1

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

看看这里的格式。

#include<stdio.h> 
int  main(void)
{
   int m=1;
   printf("m=%u\n",&m);  // 3219008780
   printf("m=%p\n",&m);  // 0xbfde2d0c
}
于 2013-06-02T00:40:36.427 回答
1

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

于 2013-06-02T00:41:38.087 回答