什么时候C和C ++ - 编译器隐式地将浮点数转换或提升为double?

时间:2016-03-15 09:07:42

标签: c++ c c++11 compilation

对于嵌入式项目,我想知道符合标准的C编译器(C99)和C ++编译器(C ++ 11)何时最有可能隐式地将单浮点变量/值提升为双倍浮。

我知道有两种情况:

  1. 不以f为后缀的文字。例如:3.14
  2. 使用variadic argument-list(...
  3. 将float传递给函数

    还有其他人吗?模板怎么样?

    this question的答案对我也非常有帮助 - 包括在此供参考。

1 个答案:

答案 0 :(得分:7)

在C:

带有.并且没有后缀的数字文字,例如3.14,不涉及任何促销活动。它的整个生命周期都是double

如果float是函数调用的参数,则float 提升为double,并且被调用的函数在范围内没有原型,或者参数对应省略号({{1}在范围内的原型中。

在以下任何一种情况下,浮动转换加倍:

  • float是函数调用的参数,该函数调用对应于范围内原型中...类型的参数。
  • 二元运算符具有doubledouble作为两种参数类型。适用的运算符为:float
  • 条件运算符* / + - < > <= >= == !=double作为第二个和第三个操作数(以任意顺序排列)
  • 浮动广告投放到float
  • 浮动分配给double(包括复合分配)

在C ++中,除了没有原型的情况外,所有上述情况仍然适用(因为C ++要求所有函数调用都在范围内有原型)。

有一个新案例:standard conversion sequence太复杂,无法简要总结。但作为示例,此C ++代码包含从doublefloat的隐式转换:

double

我不确定这是否是C ++的详尽列表。

相关问题