我有两个文件:
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,但为什么我会得到这些值?这到底是什么意思?
最佳答案 首先,我很确定你在你的printf中使用“%x”而不是“%d.其次,我很确定它是40180000而不是4018000(额外的零).
假设这是真的,这里是你得到这个值的地方:
在第一个程序中,x和y作为整数(4个字节)存储在内存中彼此相邻的右侧.第二个程序链接到第一个程序的“x”并将其视为double(8个字节),不为第二个程序分配新的内存.
现在用于IEEE双精度(link here)中的“6”的二进制表示
0x01000000 00011000 00000000 00000000 00000000 00000000 00000000 00000000存储在“x”
HEX = 0x4018000000000000
由于第一个程序只看到int部分
0x01000000 00011000 00000000 00000000
= 0x40180000
由于“%x”显示十六进制“40180000”已打印.
顺便说一句:为了确保你的结果再现了.