我理解 C++ 将 INT_MIN 定义为 (-2147483647 - 1) 的原因,但他们为什么不只使用 1<<31 呢?这可以防止溢出并且也易于理解。
问问题
594 次
2 回答
7
防止溢出,也易于理解
如果通过左移一个正数你试图获得一个负数,它怎么能防止溢出?;)
请记住,有符号整数溢出是未定义的行为。根据 C++11 标准的第 5.8/2 段:
的值
E1 << E2
是E1
左移的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 回答