C 和 C++ 编译器何时将浮点数隐式转换或提升为双精度
When do C and C++-compilers convert or promote a float to double, implicitly?
对于嵌入式项目,我想知道符合标准的C编译器(C99)和C++编译器(C++11)何时最有可能隐式地将单浮点变量/值提升为双浮点数。
我知道有两种情况:
- 不带
f
后缀的文本。例如:3.14
- 将浮点数传递给带有可变参数列表的函数 (
...
)
还有其他人吗?模板呢?
这个问题的答案对我也很有帮助 - 包括在这里以供参考。
在 C 中:
带有.
且没有后缀的数字文字,例如 3.14
,不涉及任何促销。它的整个生命周期都是double
的。
如果浮点数是函数调用的参数,并且被调用的函数在作用域中没有原型,或者参数对应于作用域中原型中的省略号 (...
),则浮点数将提升为双精度。
在以下任何一种情况下,浮点数将转换为双精度:
- float 是函数调用的参数,对应于作用域中原型中类型
double
的参数。 - 二元运算符将
double
和float
作为两种参数类型。这适用于的运算符是:* / + - < > <= >= == !=
- 条件运算符将
double
和float
作为第二个和第三个操作数(按任一顺序) - 浮子被铸造到
double
- 浮时被指派给
double
(包括复合赋值)
在C++中,上述所有情况仍然适用,除了没有原型的情况(因为C++要求所有函数调用在范围内都有一个原型)。
有一个新的情况:标准转换序列太复杂,无法简要总结。但作为一个例子,这个C++代码包含从float
到double
的隐式转换:
class T { public: T(double dummy) {} };
void foo(T);
foo(3.14f); // Conversion sequence: float->double->T
不过,我不确定这是否是C++的详尽列表。
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何从字符串转换为双精度*
- C++如何将字符串逐行转换为双精度
- 如何防止双精度值到整数的隐式转换
- 如果存在从"双精度"到"T"的转换,则禁用构造函数
- 在C++中将字符串转换为双精度,而无需科学记数法
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 如何在C++中将字符串转换为双精度?
- 将双精度值转换为 char 变量时字符串流如何工作
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 在 c++ 中从双精度转换为字符串
- 如何在C++中将无符号字符缓冲区转换为双精度?
- 从字符串转换为双精度和整数 - C++
- 如何使用按位运算将随机uint64_t转换为范围 (0, 1) 的随机双精度
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- 表达式中应用的转换(双精度为整数)
- 无法转换双精度 - 新运算符
- C++类型转换双精度