在 C++ 中将 float 与双溢出相乘

Multiplying float with double overflow in C++

我对这个警告的意义有点困惑:
算术溢出:对 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();
}

根据我的理解,当我们将 float 值与 double 值相乘时,我们基本上将 4byte 值乘以 8byte 值,因此,根据我阅读的链接,我们将失去一些精度:

http://www.cplusplus.com/articles/DE18T05o/#:~:text=Overflow%20is%20a%20phenomenon%20where,be%20larger%20than%20the%20range

但是,当我输出这个时,我得到了一个双精度值
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 值相乘。但是当它自动将 intdouble 的乘法转换为 double 值时,警告仍然不应该存在。

警告是因为这个乘法:10 * c_MILLIONc_MILLION 的某些值可能会丢失一些精度,如果 c_MILLION 首先转换为 double 则不会丢失。由于此乘法的结果被转换为 double,错误的程序员可能会认为如果操作数首先是 double,则没有超出预期的精度损失。因此警告。