当我使用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 也不会产生警告......
提前感谢您的帮助。
答案 0 :(得分:1)
行为符合标准:
4.8浮点转换[conv.double]
浮点类型的prvalue可以转换为另一个浮点类型的prvalue。如果 源值可以在目标类型中准确表示,转换的结果就是精确的 表示。如果源值在两个相邻目标值之间,则为转换结果 是这些值中任何一个的实现定义选择。否则,行为未定义。
此外,值浮点类型可以转换为整数类型的值:
4.9浮动积分转换[conv.fpint]
浮点类型的prvalue可以转换为整数类型的prvalue。转换截断; 也就是说,丢弃小数部分。如果截断值不能,则行为未定义 以目的地类型表示。