【发布时间】:2012-09-12 21:00:33
【问题描述】:
我对隐式类型转换有点困惑。给定以下程序
float x = 4.23423451;
double y = 4.23423451;
float z = 101.9876;
float res1 = x * z;
float res2 = y * z;
std::cout << "res1 & res2 " << res1 << " & " << res2 << std::endl;
std::cout << "equality " << (res1 == res2) << std::endl;
输出是
res1 & res2 431.839 & 431.839
equality 1
我的问题是“对于 x、y 和 z (x = y) 的任何值以及任何编译器来说,相等性是否总是正确的?”
在
res2 = y * z;
变量“y”会被类型转换为浮点数还是变量“z”被类型转换为双精度?
【问题讨论】:
-
这是明确定义的。
z的中间表达式将扩展为double,因此y * z将是double表达式。然后隐式缩小转换会将其转换为float以存储在res2中。同样适用于res1。 -
话虽如此,
res1不一定等价于res2-- 它高度依赖于环境中float和double的精度。这两个文字甚至可能不相等——4.23423451f不需要等同于4.23423451。 -
如果您使用的是 Visual Studio:转到项目属性 -> C/C++ -> 常规 -> 警告级别。将其设置为 3 级。在错误窗口的警告部分中,它将显示不是由您手动投射的投射。我确定另一个 IDE 也会有类似的东西。希望有帮助
-
@QuantumKarl - 关于术语的一点:cast 是您在源代码中编写的内容。它告诉编译器进行转换。在某些情况下,编译器会在没有 cast 的情况下进行 conversion。这些称为隐式转换。
-
@Pete - 谢谢指出,它仍在以任何一种方式进行转换。随着警告设置的增加,编译器将警告您有关您未手动告诉编译器进行强制转换的任何转换。上面的代码在 res2 = y * z 上生成此“警告 C4244:'initializing':从 'double' 转换为 'float',可能丢失数据”;告诉你 y 正在转换为浮点数。
标签: c++