为什么不将C ++定义为INT_MIN(1 <&lt;&lt; 31)

时间:2013-06-02 15:40:35

标签: c++ numeric-limits

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

2 个答案:

答案 0 :(得分:7)

  

防止溢出并且易于理解

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

请记住,有符号整数溢出是Undefined Behavior。根据C ++ 11标准的第5.8 / 2段:

  

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

另外,根据第5/4段:

  

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

答案 1 :(得分:4)

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