我理解为什么C ++将INT_MIN定义为(-2147483647-1),但为什么他们不使用1<< 31?这可以防止溢出并且易于理解。
答案 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
)。