【问题标题】: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 中,您所看到的并不完全是您认为的那样。

【问题讨论】:

  • 编译器将尽最大努力以尽可能少的精度损失进行转换
  • @YePhIcK:希望有任何合理的实施。

标签: 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 的转换 但总是向零舍入。

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 2013-01-20
    • 2014-05-11
    • 2021-06-21
    • 1970-01-01
    • 2019-06-30
    • 2019-05-20
    • 2020-08-07
    相关资源
    最近更新 更多