如何比较两个int64整数的和与INT64_MAX的大小并处理溢出问题
int64_t 加法溢出的正确校验方案
首先你的原代码存在根本性问题:C++标准明确规定有符号整数溢出属于未定义行为,编译器会直接优化掉a + b <= INT64_MAX这类溢出后校验的判断逻辑,实际运行结果完全不符合预期。
要在加法执行前完成溢出校验,判断两个int64_t相加是否超过INT64_MAX,正确的逻辑如下:
- 只有两个数都为正时才有可能溢出超过
INT64_MAX,如果b <= 0,a + b必然小于等于a,不可能超过最大值 - 正数场景下将加法判断转换为不会溢出的减法判断:只要
a > INT64_MAX - b,就说明相加会溢出
修改后的可运行代码如下:
#include <iostream> #include <cstdint> using namespace std; int main() { int64_t a = INT64_MAX; int64_t b = 1; // cin >> a >> b; // 先校验是否溢出,没溢出的情况下再判断大小 if (b <= 0 || a <= INT64_MAX - b) { // 无溢出,a + b <= INT64_MAX 成立 cout << "Yes" << endl; } else { // 溢出,a + b 大于 INT64_MAX cout << "No" << endl; } return 0; }
如果还需要同时判断相加后下溢(小于INT64_MIN)的场景,可以补充对应判断逻辑:当b < 0且a < INT64_MIN - b时,相加会发生下溢。
内容的提问来源于stack exchange,提问作者douyu
相关产品推荐
相关产品推荐

