直到最近,我才想到:
printf("%f",x)
将尝试从堆栈中读取4字节的浮点值。
printf("%lf",x)
会尝试从堆栈中读取一个8字节的浮点值。
但是,以下代码似乎产生了正确的输出:
float f = 1234.5;
double d = 12345678.9;
printf("Output = %u %u\n",sizeof(f),sizeof(d)); // Output = 4 8
printf("Output = %.1f %.1f\n",f,d); // Output = 1234.5 12345678.9
我相信它证明printf("%f",x)
从堆栈读取一个8字节的浮点值。
这是因为两个值都正确打印,但12345678.9太大而无法放入4字节变量。
现在我的问题是:当使用4字节printf
变量调用float
时,编译器如何知道它应该在推送之前将其转换为8字节double
值它进入堆栈并调用printf
?
在调用带浮点参数的函数时,这是标准的一部分吗?
由于
答案 0 :(得分:7)
编译器如何知道在将其推入堆栈并调用printf之前应将其转换为8字节的双精度值?
它不必知道何时这样做 - 它始终如此;它是default argument promotions的一部分。
在调用带浮点参数的函数时,这是标准的一部分吗?
不,只是可变的。