使用强制转换从long double
转换为float/double/int
是安全的吗?在C中,如果我将类型T1
转换为T2
,我将安全地使用T2
类型的变量,这个类型可以容纳的所有位数不会少或者我错过了什么,说,一个UB?我问的是因为在C中你看到的并不完全是你的想法。
答案 0 :(得分:3)
在标准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的转换 但总是朝零。