【问题标题】:Can I convert from long double to float/double/int just using cast?我可以仅使用 cast 从 long double 转换为 float/double/int 吗?
【发布时间】:2014-06-29 22:10:34
【问题描述】:
仅使用 cast 从long double 转换为float/double/int 是否安全?在 C 中,如果我将类型 T1 转换为 T2 ,我是否会安全地拥有类型为 T2 的变量,正是这种类型不能容纳的所有位,或者我错过了什么,比如 UB?我之所以这么问,是因为在 C 中,您所看到的并不完全是您认为的那样。
【问题讨论】:
标签:
c
casting
type-conversion
【解决方案1】:
在标准 C 中,如果值可以在目标类型中精确表示,则保留该值。
如果它在目标类型的范围内,则两个最接近的值之一(实现定义的选择规则)结果。
否则,严格来说,我们有未定义行为,除非实现声称符合 IEEE60559。
6.3.1.4 实数浮点数和整数
1 当实浮点类型的有限值转换为_Bool以外的整数类型时,
小数部分被丢弃(即,该值被截断为零)。如果值
整数部分不能用整数类型表示,行为未定义。61)
2 当整数类型的值转换为真正的浮点类型时,如果该值是
convert 可以精确地表示为新类型,它是不变的。如果值是
转换在可以表示但不能表示的值范围内
确切地说,结果是选择的最接近的较高或最近的较低可表示值
以实现定义的方式。如果要转换的值超出范围
可以表示的值,行为是未定义的。一些隐含的结果
转换可以用比所要求的更大的范围和精度来表示
新类型(见 6.3.1.8 和 6.8.6.4)。
6.3.1.5 真正的浮点类型
1 当一个真正的浮点类型的值被转换为一个真正的浮点类型时,如果该值被
convert 可以精确地表示为新类型,它是不变的。如果值是
转换在可以表示但不能表示的值范围内
确切地说,结果是选择的最接近的较高或最近的较低可表示值
以实现定义的方式。如果要转换的值超出范围
可以表示的值,行为是未定义的。一些隐含的结果
转换可以用比所要求的更大的范围和精度来表示
新类型(见 6.3.1.8 和 6.8.6.4)。
如果您的实现通过定义预处理器宏 __STDC_IEC_559__ 来声明符合 IEEE60559 的浮点,情况会大大改善。
— 浮点类型的转换提供了 IEC 60559 之间的转换
浮点精度。
— 从整数到浮点类型的转换提供 IEC 60559 转换
从整数到浮点。
— 从浮点类型到整数类型的转换提供了类似 IEC 60559 的转换
但总是向零舍入。