如果原始值在结果类型中是可精确表示的,则转换为另一种浮点类型的浮点值的值不会发生任何变化。 如果原始值是数值,但不能精确地表示,则结果是下一个更大的可表示值或下一个更小的可表示值。 有关浮点类型的范围,请参阅
浮点常量的限制
。
首先通过丢弃任何小数值来截断转换为整型类型的浮点值。 如果这个截断的值在结果类型中是可表示的,那么结果必须是该值。 如果结果值不可表示,结果值是未定义的。
Microsoft 专用
Microsoft 编译器对
float
值使用 IEEE-754 binary32 表示,并对
long double
和
double
使用 binary64 表示。 由于
long double
和
double
使用相同的表示,因此它们有相同的范围和精度。
当编译器将
double
或
long double
浮点数转换为
float
时,它根据浮点环境控制(默认为“舍入到最近值,但绑定到偶数”)对结果进行舍入。如果数值太大或太小而无法表示为数值
float
,转换结果为正无穷或负无穷(具体视原始值的符号而定),并引发溢出异常(如果启用的话)。
转换为小于
long
的整型类型的结果是将值转换为
long
,然后转换为结果类型的结果。
对于转换为至少与
long
一样大的整型类型,如果转换的值太大或太小而无法在结果类型中表示,则可能会返回以下任何值:
结果可能是一个标记值,它是离零最远的可表示值 。 对于有符号类型,它是最小的可表示值 (0x800...0)。 对于无符号类型,它是最大的可表示值 (0xFF...F)。
结果可能是“饱和”,其中因过高而无法表示的值将转换为可表示的最高值。 因过小而无法表示的值将转换为可表示的最小值。 这两个值中的一个也用作标记值。
对于转换为
unsigned long
或
unsigned long long
,转换超出范围的值的结果可能是除最高或最低可表示值之外的其他值。 结果是标记值还是饱和值取决于编译器选项和目标体系结构。 将来的编译器版本可能会返回一个饱和值或标记值。
结束 Microsoft 专用
下表汇总了来自浮点型的转换。
浮点类型转换表