我有两个文件:
fir.c
int x = 7;
int y = 5;
int main()
{
p2();
printf("%d\n", x);
return 0;
}
还有:
sec.c
double x;
void p2()
{
x = 6;
}
在链接和编译这两个文件后,我打印x
并输出0作为输出。
此外,在打印y
后,我得到4018000
作为输出。
我理解x
会覆盖y
,但为什么我会得到这些值?这究竟是什么意思?
答案 0 :(得分:2)
首先,我很确定你使用"%x"而不是"%d在你的printf中。其次,我很确定它是40180000而不是4018000(额外的零)。
假设这是真的,在这里你得到这个值:
在第一个程序中,x和y作为整数(4个字节)在内存中彼此相邻地存储。第二个程序链接到第一个程序" x"并将其视为double(8个字节),不为第二个程序分配新的内存。
现在为" 6"的二进制表示在IEEE双精度(link here)
中0x01000000 00011000 00000000 00000000 00000000 00000000 00000000 00000000存储在" x"
HEX = 0x4018000000000000
由于第一个程序只看到int部分
0x01000000 00011000 00000000 00000000
= 0x40180000
因为"%x"向你展示了十六进制" 40180000"打印出来。
顺便说一句:为了确保你的结果再现了。