C 和 C++ 编译器何时将浮点数隐式转换或提升为双精度

When do C and C++-compilers convert or promote a float to double, implicitly?

本文关键字:转换 双精度 C++ 编译器 何时 浮点数      更新时间:2023-10-16

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

我知道有两种情况:

  1. 不带 f 后缀的文本。例如:3.14
  2. 将浮点数传递给带有可变参数列表的函数 ( ...

还有其他人吗?模板呢?

这个问题的答案对我也很有帮助 - 包括在这里以供参考。

在 C 中:

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

如果浮点数是函数调用的参数,并且被调用的函数在作用域中没有原型,或者参数对应于作用域中原型中的省略号 (...),则浮点数将提升为双精度。

在以下任何一种情况下,浮点数将转换为双精度:

  • float 是函数调用的参数,对应于作用域中原型中类型 double 的参数。
  • 二元运算符将 doublefloat 作为两种参数类型。这适用于的运算符是:* / + - < > <= >= == !=
  • 条件运算符将 doublefloat 作为第二个和第三个操作数(按任一顺序)
  • 浮子被铸造到double
  • 浮时被指派给double(包括复合赋值)

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

有一个新的情况:标准转换序列太复杂,无法简要总结。但作为一个例子,这个C++代码包含从floatdouble的隐式转换:

class T { public: T(double dummy) {} };
void foo(T); 
foo(3.14f); // Conversion sequence: float->double->T

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