double d1 = 12.34;int i1 = d1; printf("i1 = %d\n", i1);
浮点值 12.34 转换为整数时,后面的小数部分会被丢弃,因此这段代码的运行结果是:
i1 = 12
如果整数部分无法由整数类型表示,则该行为是未定义的。例如:
double d2 = 98765.43;unsigned short us = d2; printf("us = %d\n", us);
由于 unsigned short 能够表示的最大值是 32767,因此浮点值 98765.43 的整数部分无法被 unsigned short 表示,该行为是未定义的。在 x64-Ubuntu 环境下,这段代码的运行结果是:
us = 33229
注:这里的结果 33229 是由 98765 - 65536 打算得来的,也便是说实行了无符号整型转换过程中的取余运算。但这在浮点型和无符号整型之间的转换中不是必须的,因此可移植的浮点值的范围是 -1 至无符号整型最大值 + 1 之间。
整型之间的转换
当一个整数类型值被转换为浮点类型时,如果该值能够被浮点类型精确表示,则值保持不变。例如:
int i2 = 17; double d3 = i2; printf("d3 = %f\n", d3);
由于整数值 17 能够被浮点类型精确表示,因此这段代码的运行结果是:
d3 = 17.000000
如果被转换的整数值在可表示范围值内但不能精确表示,则结果要么是最靠近可表示值的稍大值,要么是最靠近可表示值的稍小值,详细选择哪个值取决于实现定义的办法。如果被转换的整数值不在可表示浮点值范围以内,该行为是未定义的。
一些隐式转换的结果可能会利用比哀求的浮点型更宽的范围和精度来表示。
#头条创作寻衅赛##C措辞逐日小知识#