C语言中FLT_MAX相加得inf?强制类型转换后结果正常的原因
两段C语言代码的行为差异解释
第一段代码
#include <stdio.h> #include <float.h> int main() { printf("FLT_MAX = %e\n", FLT_MAX); double d = FLT_MAX + FLT_MAX; printf("FLT_MAX * 2 = %e\n", d); return 0; }
输出:
FLT_MAX = 3.402823e+38 FLT_MAX * 2 = inf
第二段代码
#include <stdio.h> #include <float.h> int main() { printf("FLT_MAX = %e\n", FLT_MAX); double d = (double)FLT_MAX + FLT_MAX; printf("FLT_MAX * 2 = %e\n", d); return 0; }
输出:
FLT_MAX = 3.402823e+38 FLT_MAX * 2 = 6.805647e+38
差异原因
- 第一段代码的溢出逻辑:
FLT_MAX是float类型的最大可表示值。当两个float类型的FLT_MAX相加时,运算全程在float类型范围内进行。FLT_MAX的两倍已经超出float能承载的最大值,触发正浮点数溢出,按照IEEE 754标准,溢出结果会被表示为inf(正无穷大),后续赋值给double变量后,输出自然就是无穷大。 - 第二段代码的正常计算逻辑:当其中一个
FLT_MAX被强制转为double类型后,根据C语言的类型提升规则,另一个float类型的FLT_MAX会自动升级为double,加法运算就变成了double类型间的计算。double的最大可表示值DBL_MAX(约1.8e308)远大于FLT_MAX的两倍(约6.8e38),因此加法能正常完成,得到准确的两倍结果,赋值给double变量后输出正确数值。
内容的提问来源于stack exchange,提问作者nr.sila
相关产品推荐
相关产品推荐

