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

Glu*_*ton 25 c++ undefined-behavior

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

标准说:

4.10浮动积分转换

可以将浮点类型的prvalue转换为整数类型的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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0  
-2147483648  
Run Code Online (Sandbox Code Playgroud)

结果std::numeric_limits<int>::infinity() 很明确,等于0,但我找不到任何有关无限投射的信息.

nat*_*ate 21

无穷大到整数的转换是不确定的.

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

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


Ben*_*igt 16

你说

我无法判断"截断值是否无法表示"是否涵盖无穷大

但这一切归结为

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

C标准(通过26.9合并到C++中)非常清楚地回答:

<code>int</code>(我希望这部分毫无疑问),行为是不确定的.</p></p>
        <ul class=

  • 我们是否有任何证据表明在这种意义上"截断"等同于C库`trunc`函数的行为? (3认同)

  • kfs*_*one 5

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

    标准说:18.3.2.4

    静态 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。