4

我理解 C++ 将 INT_MIN 定义为 (-2147483647 - 1) 的原因,但他们为什么不只使用 1<<31 呢?这可以防止溢出并且也易于理解。

4

2 回答 2

7

防止溢出,也易于理解

如果通过左移一个正数你试图获得一个负数,它怎么能防止溢出?;)

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

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

此外,根据第 5/4 段:

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

于 2013-06-02T15:42:29.387 回答
4

因为1 << 31调用未定义的行为(假设 32-bit int)。

于 2013-06-02T15:42:11.127 回答