为什么int提升为double而不是float进行隐式转换

Why is int promoted to double and not float for implicit conversion

我目前正在学习 C++ 思想 C++ Primer。在关于类型转换的 4.11 章中,我注意到该章很少讨论从整数类型到浮点类型的隐式转换,而是真正主要关注整数类型内的转换。因此,我不太确定从整数类型到浮点类型的转换规则。

我的问题来自本章的例子:

int ival = 3.541 + 3

章节中提到在添加3.541之前将3转换为double类型。

这个问题源于这样一个事实,即对于大多数整数类型,它们在隐式转换期间大多被提升为 int,除非它们无法适合 int。既然intfloat都是一样的4字节大小,而且3.0和3.541完全可以装进一个float,为什么要用高阶的double来隐式转换在这种情况下而不是 float?这是否意味着对于任何整数类型到浮点类型的隐式转换,整数类型将被转换为 double 而不管精度或大小?

非常感谢!

3.541 是双倍的。这就是另一个参数需要转换成的内容。

后缀用于表示文字的精度,3.541f(或 F)是浮点数,3.541L(或 l)是长双精度数。默认(无后缀)是双精度的。来源 http://en.cppreference.com/w/cpp/language/floating_literal .

3.541 不适合任何这些长度,因为它是二进制的重复分数。实际值将是尽可能接近 3.541 的浮点值(如 3.540999999999999925393012745189480483531951904296875 在双精度的情况下)。

默认情况下,如果你这样写:

int ival = 3.541 + 3;

3.541 将被视为 double,因为没有任何后缀,这是编译器默认假定的。如果你想让它像一个浮点数一样对待,这样做:

int ival = 3.541f + 3; //See the 'f' there. For floats

此外,如果您想知道为什么有时 3.1541 没有正确表示,可能是因为它的二进制表示不够准确。阅读 this article for more info