int到float转换会产生警告吗?

use*_*214 12 c++ implicit-conversion

这是令人惊讶,我看到,即使值可以转换,一个int浮动转换始终给予警告.为什么是这样?

int i = 0;
float f = 0; // warning here

// I thought this was an implicit conversion,
// meaning it is convertible with no warnings.
f = i;      // another warning here
Run Code Online (Sandbox Code Playgroud)

警告是:

warning C4244: '=' : conversion from 'int' to 'float', possible loss of data
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 9

这取决于您的int类型中有多少位.IEEE754单精度的浮点数是32位值,但其中一些位被赋值给指数,这意味着并非所有位都可用于精度.

如果你的int类型比你的类型更精确float,那么你可能会在高端失去精确度.

换句话说,它可能无法区分INT_MAXINT_MAX - 1.

在这种情况下的解决方案是使用更宽的浮点类型(double),但从技术上讲,您可能会发现一个具有256位int类型的实现,在这种情况下,您将不得不找到另一种方式:-)

这个答案简要概述了浮点格式的工作原理,包括32位中只有23位可用于尾数的精度.


Mys*_*ial 6

我在这里回答了类似的问题:

为什么 GCC 对这种隐式转换发出警告?

原因是当int将 an 转换为 a 时需要进行舍入,float因为在这种情况下float不能包含 an 的所有精度int

在你的例子中, afloat只有大约 24 位精度。因此,虽然 anint具有 32 位精度,但此转换会损失一些精度,因此会出现警告。