我可以使用强制转换从long double转换为float / double / int吗?

时间:2014-06-29 22:10:35

标签: c casting type-conversion

使用强制转换从long double转换为float/double/int是安全的吗?在C中,如果我将类型T1转换为T2,我将安全地使用T2类型的变量,这个类型可以容纳的所有位数不会少或者我错过了什么,说,一个UB?我问的是因为在C中你看到的并不完全是你的想法。

1 个答案:

答案 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的转换   但总是朝零。