使用cast从long double
转换到float/double/int
是安全的吗?在C语言中,如果我将类型T1
转换为T2
,我是否可以安全地在类型T2
的变量中拥有该类型可以容纳的所有比特,或者我是否遗漏了一些东西,比如UB?我问这个是因为在C语言中你看到的和你想象的不完全一样
在标准C语言中,如果值可以准确地用目标类型表示,则保留该值。
如果它在目标类型的范围内,则结果是两个最接近的值之一(用于选择的实现定义的规则)。
否则,严格来说,我们有未定义行为,除非实现声明符合IEEE60559。
6.3.1.4实浮点数和整型1当将实浮点型的有限值转换为非_Bool型的整型时,小数部分被丢弃(即,值被截断到零)。的值整数部分不能用整数类型表示,行为是未定义的。61)
2将整型值转换为实浮点型时,如果该值为转换后可以在新的类型中精确地表示,它是不变的。如果值为已转换值在可以表示但不能表示的值范围内确切地说,结果是所选择的最接近的可表示值的较高值或最接近的较低值以实现定义的方式。如果要转换的值在值可以表示,行为是未定义的。一些隐式的结果方法所要求的转换可以用更大的范围和精度表示新类型(见6.3.1.8和6.8.6.4)。
6.3.1.5实浮动类型1实浮点型转换为实浮点型时,如果该值为转换后可以在新的类型中精确地表示,它是不变的。如果值为已转换值在可以表示但不能表示的值范围内确切地说,结果是所选择的最接近的可表示值的较高值或最接近的较低值以实现定义的方式。如果要转换的值在值可以表示,行为是未定义的。一些隐式的结果方法所要求的转换可以用更大的范围和精度表示新类型(见6.3.1.8和6.8.6.4)。
如果您的实现通过定义预处理器宏__STDC_IEC_559__
来声明符合ieee60559的浮点数,则情况会得到很大改善。
-浮点类型的转换提供了IEC 60559之间的转换浮点精度。
—从整型到浮点型的转换提供IEC 60559的转换从整数到浮点。
-从浮点型到整型的转换提供类似IEC 60559的转换但总是趋向于0。