【发布时间】:2020-08-25 17:40:15
【问题描述】:
我对这个警告的意义有点困惑:
算术溢出:对 4 字节值使用运算符“”,然后将结果转换为 8 字节值。在调用 '' 运算符之前将值转换为更广泛的类型以避免溢出。
#include <iostream>
using std::cin;
using std::cout;
using std::ios_base;
int main() {
cout.setf(ios_base::fixed, ios_base::floatfield);
double mints = 10.0 / 3.0;
const float c_MILLION = 1e6;
cout << "\n10 million mints: " << 10 * c_MILLION * mints;
cin.get();
}
根据我的理解,当我们将浮点值与双精度值相乘时,我们基本上是将 4 字节值乘以 8 字节值,因此根据我阅读的链接,我们将失去一些精度:
但是,当我输出这个时,我得到一个双精度值
https://i.stack.imgur.com/EOQzm.png
如果是这样,如果 c_MILLION 自动将其更改为双精度结果,为什么还要提醒我将其强制转换为双精度值?无论如何,它无法将 8 字节值转换为 4 字节值。那么,既然它已经让我们摆脱了这个麻烦,为什么还要费心去警告程序员呢?
或者它也可以将 8 字节值转换为 4 字节值。如果是这样,它如何确定要打印的类型?这是一个我无法从我阅读的链接中找到答案的问题。
如果它自动将结果转换为 8byte 值,那么显示此警告的意义何在?
这是警告:
https://i.stack.imgur.com/L2szy.png
严重性代码说明项目文件行抑制状态
警告 C26451 算术溢出:对 4 字节值使用运算符“*”,然后将结果转换为 8 字节值。在调用运算符'*'之前将值转换为更广泛的类型以避免溢出(io.2)
问题是我将int 值与double 值相乘。但是当它自动将int 与double 的乘法转换为double 值时,警告仍然不存在。
【问题讨论】:
-
你用的是什么编译器?我无法收到此警告。 AFAICT,您的代码很好。
-
"...为什么要提醒我..."什么警告 - 直播 - godbolt.org/z/joxG6K
-
我正在使用 g++ 编译器和 Visual Studio 2019 IDE。我收到此警告算术溢出:在 4 字节值上使用运算符 *,然后将结果转换为 8 字节值。在调用运算符 * 之前将值转换为更宽的类型以避免溢出。
-
我不知道这个问题被否决的原因,至少给我一个为什么这个问题被否决的原因?
-
@RichardCritten 我已经上传了警告图片。
标签: c++ floating-point truncate