【问题标题】:When do C and C++-compilers convert or promote a float to double, implicitly?C 和 C++ 编译器何时将浮点数隐式转换或提升为双精度值?
【发布时间】:2023-04-06 11:54:01
【问题描述】:

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

我知道两种情况:

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

还有其他人吗?模板呢?

this question 的回答对我也很有帮助 - 包括在此处以供参考。

【问题讨论】:

  • 在所有使用通常算术转换的操作中。
  • 您可能想了解standard conversions in C++。还有for C as well
  • @Patrick B. 至于文字,则没有转换。它是 lfloating 字面量的定义。
  • 无论如何您都不能将double 传递给模板。并且模板实例化会有一个具体的函数签名。

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


【解决方案1】:

在 C 中:

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

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

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

  • float 是函数调用的参数,对应于作用域原型中double 类型的参数。
  • 二元运算符有doublefloat 作为两种参数类型。适用的运营商是:* / + - < > <= >= == !=
  • 条件运算符将doublefloat 作为第二个和第三个操作数(按任意顺序)
  • 浮点数被转换为double
  • 浮点数被分配给double(包括复合分配)

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

有一个新案例:standard conversion sequence,太复杂了,无法简单概括。但作为一个例子,这个 C++ 代码包含从 floatdouble 的隐式转换:

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

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

【讨论】:

  • C++ 没有“没有原型的函数”(即在 C++ 中,void foo() 是一个没有参数的函数)。除此之外,这些情况也都适用于 C++。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多