为啥 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
。既然int
和float
都是相同的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中用for循环有一句double avg = 0.0;为啥是0.0,而不是0?为啥要用double?
Swift JSONSerialization 作为 Int 而不是 Double