我一直在读C Primer Plus书并得到了这个例子
#include <stdio.h>
int main(void)
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.32e-5;
printf("%f can be written %e\n", aboat, aboat);
printf("%f can be written %e\n", abet, abet);
printf("%f can be written %e\n", dip, dip);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的macbook上运行后,我对输出感到非常震惊:
32000.000000 can be written 3.200000e+04
2140000000.000000 can be written 2.140000e+09
2140000000.000000 can be written 2.140000e+09
Run Code Online (Sandbox Code Playgroud)
所以我仔细看了一下,发现显示long double的正确格式是使用%Lf.不过,我仍然不明白为什么我得到了双重abet价值,而不是我得到了什么,当我跑它在Cygwin的,Ubuntu的和iDeneb的话这大概是
-1950228512509697486020297654959439872418023994430148306244153100897726713609
013030397828640261329800797420159101801613476402327600937901161313172717568.0
00000 can be written 2.725000e+02
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
尝试查看OSX上的varargs调用约定,这可能会解释它.
我猜测编译器传递long double堆栈(或FPU寄存器)中的第一个double参数,以及CPU寄存器(或堆栈)中的第一个参数.无论哪种方式,他们都在不同的地方通过.因此,当进行第三次调用时,第二次调用的值仍然存在(并且被调用者将其拾取).但这只是猜测.