You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何比较两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:45:02