如何将两个 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;
}
在添加之前先将 b
与 INT64_MIN - a
或 INT64_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 次比较。
我知道大于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;
}
在添加之前先将 b
与 INT64_MIN - a
或 INT64_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 次比较。