为啥 int 被提升为 double 而不是 float 以进行隐式转换

Posted

技术标签:

【中文标题】为啥 int 被提升为 double 而不是 float 以进行隐式转换【英文标题】:Why is int promoted to double and not float for implicit conversion为什么 int 被提升为 double 而不是 float 以进行隐式转换 【发布时间】:2016-09-05 11:38:02 【问题描述】:

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

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

int ival = 3.541 + 3

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

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

非常感谢!

【问题讨论】:

3.541 根本无法放入浮点数,它是二进制的重复分数。 如果你这样做 int ival = 3.541f + 3 然后使用浮点数。 【参考方案1】:

3.541 是双精度。所以这就是另一个参数需要转换为的内容。

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于为啥 int 被提升为 double 而不是 float 以进行隐式转换的主要内容,如果未能解决你的问题,请参考以下文章

为啥他使用“typedef vector<double>::size_type”而不是使用“int”

JAVA学习笔记-类型提升的问题

Java中用for循环有一句double avg = 0.0;为啥是0.0,而不是0?为啥要用double?

Swift JSONSerialization 作为 Int 而不是 Double

java - 当没有接受long的方法时,为啥java将long参数提升为float/double?

为啥除法后我的 double 或 int 值始终为 0?