无穷大(由浮点数表示)转换为整数是否为未定义的行为?
标准说:
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
,但我找不到有关无限投射的任何信息。
答案 0 :(得分:21)
未定义无穷大到整数的转换。
如果截断的值无法在目标类型中表示,则行为未定义。
说的一切。由于截断会移除精度但不移除幅度,截断的无穷大仍然是无穷大,整数不能表示无穷大。
答案 1 :(得分:15)
你说
我无法判断&#34;截断值是否无法表示&#34;涵盖无限
但这一切归结为
截断无穷大的结果是什么。
C标准(通过26.9纳入C ++)非常清楚地回答:
由于无穷大的截断仍然是无穷大,无穷大无法在int
中表示(我希望这部分毫无疑问),行为未定义。
答案 2 :(得分:4)
我试图理解为什么
Application
和std::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。