极简设计的真实面目:少即是多的工程化实践
2026/6/15 17:38:54
在 C++ 中,1 << 31 - 1不相当于INT_MAX,而且这是一个有问题的表达式,让我们分步分析:
表达式解析1 << 31 - 1在 C++ 中会被解析为1 << (31 - 1),这是因为减法优先级高于左移,结果等于1 << 30
实际值1 << 30的结果是:
0100 0000 0000 0000 0000 0000 0000 00000x40000000INT_MAX比较INT_MAX通常是:0111 1111 1111 1111 1111 1111 1111 11110x7FFFFFFF1 << 30(1,073,741,8241,073,741,8241,073,741,824) 远小于INT_MAX(2,147,483,6472,147,483,6472,147,483,647)。重要警告:1 << 31在32位系统中是未定义行为!
因为对有符号整数左移导致溢出(符号位被修改)。
安全的做法
(1U << 31) - 1,在32位系统中等于231−12^{31} - 1231−1,即INT_MAXlong long避免溢出:(1LL << 31) - 1INT_MAX0x7FFFFFFFINT_MAX#include <climits> int max_int = INT_MAX; // 最安全、最可移植的方式总之,1 << 31 - 1是1 << 30,而INT_MAX是231−12^{31} - 1231−1,两者完全不同。