gpt4 book ai didi

c++ - C 和 C++ 编译器何时隐式地将 float 转换或提升为 double ?

转载 作者:太空狗 更新时间:2023-10-29 20:10:54 24 4
gpt4 key购买 nike

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

我知道两种情况:

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

还有其他的吗?模板呢?

this question的答案对我也很有帮助 - 将其包含在此处以供引用。

最佳答案

在 C 中:

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

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

float 在以下任何情况下都转换为 double 值:

  • float 是函数调用的参数,对应类型为double 的参数。在原型(prototype)范围内。
  • 二元运算符有doublefloat作为两种参数类型。适用的运算符是:* / + - < > <= >= == !=
  • 条件运算符有doublefloat作为第二个和第三个操作数(按任意顺序)
  • float 转换为double
  • float 分配给一个double (包括复合作业)

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

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

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

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

关于c++ - C 和 C++ 编译器何时隐式地将 float 转换或提升为 double ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36006770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com