生手求解答。

新手求解答。。
这个是我照着《c priemr plus》抄的:
#include<stdio.h>
int main(void)
{
    float aboat = 32000.0;
    double abet = 2.14e9;
    long double dip = 5.23e-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;
}

编译查出的错误是这么说的[Error] ld returned 1 exit status
但是又可以运行:
生手求解答。

但是树上的输出结果是
32000.000000 can be written 3.200000e+04
2140000000.000000 can be written 2.140000e+09
0.000053 can be written 5.320000e-05

这是怎么回事呢?新手求解答,,谢谢万能的网友!!
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

纠正一下,应该是printf()实现有差异


这个跟printf实现没关系吧, printf无法做类型检查, 也无法做类型转换, 只能直接按压入栈的参数按格式字符串指定的类型翻译.

所以这个结果应该跟 机器的大小尾端、编译对long double的处理(有的8字节, 有的12字节, 还有的16字节)有关。

如果long double 是8字节, 这段代码运行正常, 如果是12或16字节, printf 只能截取两个参数的前8字节作为第一个参数, 9-16字节作为第二个参数。

甚至%f和%e在执行时对应的参数都不一样, 也就是 %f取dip的前8个字节, 后面的%e取 dip 的后8个字节(long double 为16字节情况)或者取第一个dip的后4个字节跟第二个dip的前4个字节拼在一起(long double是12字节情况)

这就解释了楼主的执行结果为什么%f和%e输出来的不是同一个数。

谢谢解答,,但是我想问为什么我的运行结果和书上的不同,,是不同的编译器导致的吗?求解答谢谢。。。


因为程序结果跟机器的大小尾端和编译器给 long double 分配的长度有关, 只有在编译器分配 long double 跟 double 一样长, 是8字节的时候, 程序执行正确, 就像书上的例子一样, 很多编译器确实是这么做的, 因为C99标准只要求 long double 不比 double 更短. 一样长是允许的. 而你的编译器的long double比8字节长, 就出问题了.

具体到这个题, 我认为其实是作者笔误的可能性比较大, 我翻了这本书, 这段代码对应的文字描述写明白了 long double 是要用 %Lf, %Le的:

The long double type requires the %Lf, %Le, and %La specifiers to print that type. (C Primer Plus 第五版 PDF 72页)

所以猜测可能作者写示例的时候写错了, 而他的编译器恰好是把long double处理成8字节, 执行结果一样, 所以没有发现这个问题.