在c中,我试图打印出变量的地址和某些功能的地址.我得到一个是负值,另一个是正值.我的问题是:为什么C不代表所有负面或全部正值?
这是我的代码:
int foo() {
return 0;
}
int main() {
int a;
printf("%d\n",&a);
printf("%d\n",foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
-1075908992 134513684
Run Code Online (Sandbox Code Playgroud)
Ada*_*eld 29
不应以这种方式将内存地址解释为有符号整数.数字的符号取决于最高位集(假设当前正在使用的绝大多数系统使用的是二进制补码表示),因此32位系统上的0x80000000以上的存储器地址将为负数,并且存储器地址低于0x80000000将为正数.对此没有实际意义.
您应该使用%p修饰符打印内存地址; 或者,有些人%08x用于打印内存地址(或%016llx64位系统).这将始终打印为十六进制的无符号整数,这比带符号的十进制整数更有用.
int a;
printf("%p\n", &a);
Run Code Online (Sandbox Code Playgroud)
要成为最符合标准的符合,请在格式字符串中传递"%p" printf()并将参数转换为void*.
printf("%p\n", (void*)&a);
printf("%p\n", (void*)foo);
Run Code Online (Sandbox Code Playgroud)
引自标准草案(n1401.pdf)
7.20.6.1 The fprintf function
8 The conversion specifiers and their meanings are:
p The argument shall be a pointer to void. The value of the pointer
is converted to a sequence of printing characters, in an
implementation-defined manner.