C++整数溢出比较疑问:为何a+1>a判断结果为假?
问题原因解析
先看你这段代码:
int a = 2147483647; // 2^31 - 1 if (a + 1 > a) { cout << "a + 1 is greater than a\n"; } else { cout << "a + 1 is less than a\n"; }
核心原因:有符号整数的补码溢出回绕
- 你给
a赋值的是32位有符号整数的最大值(2^31 - 1,二进制为最高位0、其余位全1的数)。 - 执行
a + 1时,二进制最高位会被置1,剩余位全为0——按照32位有符号整数的补码规则,这个值对应的是最小的负数-2147483648。 - 此时比较
a + 1 > a,本质是-2147483648 > 2147483647,显然判断结果为false,所以会执行else分支的输出。
额外说明:C++标准中的未定义行为
要明确的是,有符号整数溢出在C++标准中属于未定义行为——理论上编译器可任意处理这种情况,但像Code::Blocks默认使用的GCC这类主流编译器,都会采用补码回绕的方式处理,也就是我们实际看到的正数溢出后变为负数的情况。
如果是无符号整数溢出,那是标准明确定义的行为,会按模2^n的规则循环(比如32位无符号整数最大值加1会变成0)。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

