如何将两个 int64 的总和与 INT64_MAX 进行比较?

How to compare sum of two int64 with INT64_MAX?

我知道大于INT64_MAX的数字会环绕负数,那么当总和溢出时如何比较,即总和大于INT64_MAX

#include <iostream>

using namespace std;

int main() {
  int64_t a = INT64_MAX;
  int64_t b = 1;
  // cin >> a >> b;
  if (a + b <= INT64_MAX) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }
  return 0;
}

比较前先检查a + b看是否会溢出

int is_overflow(int64_t a, int64_t b) {
  if (((b > 0) && (a > (INT64_MAX - b))) ||
      ((b < 0) && (a < (INT64_MIN - b)))) {
    return 1;
  }
  return 0;
}

在添加之前先将 bINT64_MIN - aINT64_MAX - a 进行比较,以防止 未定义的行为 (UB) 有符号整数溢出。

// True when sum overflows.
bool is_undefined_add64(int64_t a, int64_t b) {
  return (a < 0) ? (b < INT64_MIN - a) : (b > INT64_MAX - a);
}

最坏情况:2 次比较。

对于div, mul, sub