为什么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
。既然int
和float
都是一样的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
我目前正在学习 C++ 思想 C++ Primer。在关于类型转换的 4.11 章中,我注意到该章很少讨论从整数类型到浮点类型的隐式转换,而是真正主要关注整数类型内的转换。因此,我不太确定从整数类型到浮点类型的转换规则。
我的问题来自本章的例子:
int ival = 3.541 + 3
章节中提到在添加3.541之前将3转换为double
类型。
这个问题源于这样一个事实,即对于大多数整数类型,它们在隐式转换期间大多被提升为 int
,除非它们无法适合 int
。既然int
和float
都是一样的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