我目前正在学习C ++思想C ++入门。在关于类型转换的第4.11章中,我注意到本章很少讨论从积分到浮点类型的隐式转换,但实际上主要集中在积分类型内的转换。因此,我不确定从整数类型到浮点类型的转换规则。
我的问题来自章节的例子:
int ival = 3.541 + 3
本章提到在添加3.541之前3被转换为double
类型。
问题源于这样一个事实:对于大多数整数类型,它们在隐式转换期间大多被提升为int
,除非它们无法适应int
。由于int
和float
的大小相同,只有4个字节,3.0和3.541可以完全适合float
,为什么更高阶double
用于隐式转换在这种情况下,而不是float
?这是否意味着对于任何整数类型到浮点类型的隐式转换,无论精度或大小如何,整数类型都将转换为double
?
非常感谢!
答案 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