为什么C++没有将INT_MIN定义为(1 << 31)

Jun*_*Jun 4 c++ numeric-limits

我理解为什么C++将INT_MIN定义为(-2147483647-1),但为什么它们不使用1 << 31?这样可以防止溢出并且易于理解.

And*_*owl 7

这样可以防止溢出并且易于理解

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

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

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

另外,根据第5/4段:

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