【问题标题】:Why not C++ define INT_MIN as (1<<31)为什么 C++ 不将 INT_MIN 定义为 (1<<31)
【发布时间】:2013-05-28 20:58:15
【问题描述】:

我理解 C++ 将 INT_MIN 定义为 (-2147483647 - 1) 的原因,但他们为什么不直接使用 1

【问题讨论】:

  • 就个人而言,我发现同样令人惊讶的是,将其定义为 -2147483648 会失败。我的意思是,它 的确切值,但编译器会抱怨它超出范围。老实说,这很愚蠢。
  • @MatthieuM。怎么可能在范围内?毕竟是-(2147483648),而且2147483648在32位平台上肯定比INT_MAX大。
  • @MSalters:也许- 应该是数字文字的一部分?
  • @MatthieuM。这也适用于- 123 吗? IE。空间是奥肯的一部分吗?这种变化很少像看起来那么简单。您必须证明不会影响任何合理的程序。
  • @MSalters:哦,我知道现在更改它可能是不可能的(当然,空格会破坏令牌,毕竟1 2 3 不是123);我只是在批评最初的决定。

标签: c++ numeric-limits


【解决方案1】:

防止溢出,也容易理解

如果通过左移正数来尝试获得负数,它如何防止溢出? ;)

请记住,有符号整数溢出是未定义行为。根据 C++11 标准的第 5.8/2 段:

E1 &lt;&lt; E2的值是E1左移E2位位置;空出的位用零填充。 [...] 否则,如果 E1 具有带符号类型和非负值,并且 E1×2^E2 是可表示的 在结果类型的相应无符号类型中,则转换为结果类型的该值是 结果值; 否则,行为未定义

另外,根据第 5/4 段:

如果在计算表达式期间,结果未在数学上定义或不在 其类型的可表示值,行为是未定义的。 [...]

【讨论】:

  • @Guillaume:不,同一个段落也使得它未定义。
  • @Guillaume:我不这么认为。如果E1 是否定的,则适用“否则”子句
  • "如果E1 有一个有符号类型和非负值..."
  • @cHao:是给纪尧姆的吗?
  • @AndyProwl:是的,显然。 :)
【解决方案2】:

因为1 &lt;&lt; 31 调用未定义的行为(假设是32 位int)。

【讨论】:

    猜你喜欢
    • 2014-11-18
    • 2014-12-07
    • 1970-01-01
    • 2014-11-29
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多