C语言中两个float相加的结果是float、double还是编译器定义行为?
C语言两个float类型相加的结果类型说明
结论
两个float类型的值相加的运算结果明确为float类型,不属于编译器定义行为,9.0f + 8.0f的结果就是float类型。
C语言规范依据
引自C11标准第6.3.1.8节「通常算术转换」:
首先,若任一操作数对应的实数类型为long double,则另一操作数无需变更类型域,直接转换为实数类型为long double的类型。
否则,若任一操作数对应的实数类型为double,则另一操作数转换为double类型。
否则,若任一操作数对应的实数类型为float,则另一操作数转换为float类型。
两个float操作数符合上述第三条规则,无需做类型提升,运算结果保持float类型。
验证示例
可以通过C11新增的_Generic泛型选择语法直接验证类型:
#include <stdio.h> int main() { // 输出9.0f + 8.0f对应的类型名称 puts(_Generic(9.0f + 8.0f, float: "float", double: "double", long double: "long double" )); return 0; }
上述代码运行后输出float,可直观证实结果类型。
内容的提问来源于stack exchange,提问作者B. Nadolson
相关产品推荐
相关产品推荐

