在 C 语言中,当一个浮点型数值被转换为其它浮点类型时,如果新类型能够精确表示待转换值,则该值保持不变。例如:
double d1 = 12.34;
float f1 = d1;
printf("f1 = %f\n", f1);
由于浮点值 12.34 能够被 float 类型精确表示,因此值保持不变,这段代码的运行结果是:
f1 = 12.340000
如果被转换的浮点值在可表示范围值内但不能精确表示,则结果要么是最接近可表示值的稍大值,要么是最接近可表示值的稍小值,具体选择哪个值取决于实现定义的方式。
如果被转换的浮点值不在可表示浮点值范围以内,该行为是未定义的。例如:
double d2 = DBL_MAX;
float f2 = d2;
printf("f2 = %f\n", f2);
注:使用 DBL_MAX 前必须包含头文件 float.h。
当把 double 类型的最大可表示值 DBL_MAX 转换为 float 类型值时,由于超出了 float 类型的可表示范围,因此该行为是未定义的。在 x64 架构 Ubuntu 系统中,这段代码的输出是:
f2 = inf
此外,一些隐式转换的结果可能会使用比要求的浮点型更宽的范围和精度来表示。