降级为浮动时没有警告

时间:2014-09-29 03:06:00

标签: c++ macos g++ double

当我使用OSX 10.8和g ++ 4.2.1在Mac 64位机器上编译以下代码时,不会生成警告。

#include "stdio.h"

int main()
{
    double d= 3.14159;
    float res= d;
    printf("%f\n", res);
    return 0;
}

显然,自动将double降级为float可能非常危险,但编译器不会生成任何警告。我能找到的唯一解决方案是使用标志 -Wshorten-64-to-32

在我看来这是一个明显的错误,我很惊讶编译器默认不会捕获此错误。是否有任何理由为什么g ++默认不会捕获此错误?有没有更好的方法来生成警告而不使用 -Wshorten-64-to-32

如果你想知道, -Wall 也不会产生警告......

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

行为符合标准:

  

4.8浮点转换[conv.double]

     

浮点类型的prvalue可以转换为另一个浮点类型的prvalue。如果   源值可以在目标类型中准确表示,转换的结果就是精确的   表示。如果源值在两个相邻目标值之间,则为转换结果   是这些值中任何一个的实现定义选择。否则,行为未定义。

此外,值浮点类型可以转换为整数类型的值:

  

4.9浮动积分转换[conv.fpint]

     

浮点类型的prvalue可以转换为整数类型的prvalue。转换截断;   也就是说,丢弃小数部分。如果截断值不能,则行为未定义   以目的地类型表示。