将无穷大转换为整数未定义?

时间:2016-08-05 18:15:02

标签: c++ undefined-behavior

无穷大(由浮点数表示)转换为整数是否为未定义的行为?

标准说:

  

4.10浮动积分转换

     

浮点类型的prvalue可以转换为a的prvalue   整数类型。转换截断;也就是说,小数部分   被丢弃了。如果截断值不能,则行为未定义   用目的地类型表示。

但我无法判断“截断值是否无法表示”是否涵盖无穷大。

我试图理解为什么std::numeric_limits<int>::infinity()static_cast<int>(std::numeric_limits<float>::infinity() )会有不同的结果。

#include <iostream>
#include <limits>

int main ()
{
    std::cout << std::numeric_limits<int>::infinity () << std::endl;
    std::cout << static_cast<int> (std::numeric_limits<float>::infinity () ) << std::endl;
    return 0;
}

输出:

0  
-2147483648  

std::numeric_limits<int>::infinity() is well defined的结果,等于0,但我找不到有关无限投射的任何信息。

3 个答案:

答案 0 :(得分:21)

未定义无穷大到整数的转换。

  

如果截断的值无法在目标类型中表示,则行为未定义。

说的一切。由于截断会移除精度但不移除幅度,截断的无穷大仍然是无穷大,整数不能表示无穷大。

答案 1 :(得分:15)

你说

  

我无法判断&#34;截断值是否无法表示&#34;涵盖无限

但这一切归结为

  

截断无穷大的结果是什么。

C标准(通过26.9纳入C ++)非常清楚地回答:

C standard semantics for <code>trunc</code>

由于无穷大的截断仍然是无穷大,无穷大无法在int中表示(我希望这部分毫无疑问),行为未定义。

答案 2 :(得分:4)

  

我试图理解为什么Applicationstd::numeric_limits<int>::infinity()会有不同的结果。

标准说:18.3.2.4

  

static constexpr T infinity()noexcept;

     

47表示正无穷大(如果有)。 [216]

     

48对has_infinity!= false的所有专精都有意义。在is_iec559!= false的专业化中必需。

---编辑---

根据18.3.2.7/1 [numeric.special]

  

1应为所有专业提供所有成员。但是,在某些条件下,许多值只需要有意义(例如,epsilon()仅在is_integer为false时才有意义)。任何非“有意义”的值都应设置为0或false。