为什么int被提升为double而不是float用于隐式转换

时间:2016-09-05 11:38:03

标签: c++ floating-point double implicit-conversion

我目前正在学习C ++思想C ++入门。在关于类型转换的第4.11章中,我注意到本章很少讨论从积分到浮点类型的隐式转换,但实际上主要集中在积分类型内的转换。因此,我不确定从整数类型到浮点类型的转换规则。

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

int ival = 3.541 + 3

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

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

非常感谢!

2 个答案:

答案 0 :(得分:5)

3.541是双倍的。那么另一个论点需要转换成什么。

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

3.541不适合任何长度,因为它是二进制的重复分数。实际值将是浮点值尽可能接近3.541(例如3.540999999999999925393012745189480483531951904296875,如果是双倍)。

答案 1 :(得分:1)

默认情况下,如果您写的内容如下:

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