C++编程中如何检测int类型整数相加时的溢出问题?
C++ 整数求和溢出检测实现方案
有符号整数溢出属于C++的未定义行为,不能等加法执行完再判断结果,必须在加法操作前做边界校验,具体实现逻辑如下:
- 首先引入
<climits>头文件获取int类型的上下限INT_MAX、INT_MIN - 每次执行累加操作前做预判断:
- 若待加数值为正:如果当前累加和已经大于
INT_MAX - 待加数值,相加后必然超出int上限,触发上溢 - 若待加数值为负:如果当前累加和已经小于
INT_MIN - 待加数值,相加后必然低于int下限,触发下溢
- 若待加数值为正:如果当前累加和已经大于
- 检测到溢出后直接输出错误提示,终止计算即可
完整修改后代码
#include <vector> #include <iostream> #include <climits> // 新增,用于获取int类型边界 using namespace std; int main() { int N = 0; vector<int> values; cout << "请输入你想要求和的数值个数:" << '\n'; cin >> N; cout << "请输入若干整数(输入'|'停止):" << '\n'; for (int tempnum; cin >> tempnum; ) { values.push_back(tempnum); } if (N > values.size()) { cout << "错误:你要求求和的数值个数超过了输入的总数量" << '\n'; return 1; } int total = 0; bool overflow = false; for (int i = 0; i < N; i++) { int val = values[i]; // 预判断溢出 if (val > 0 && total > INT_MAX - val) { overflow = true; break; } if (val < 0 && total < INT_MIN - val) { overflow = true; break; } total += val; } if (overflow) { cout << "错误:求和结果超出int类型可表示的范围" << '\n'; return 1; } // 输出符合要求的结果 cout << "前" << N << "个数字("; for (int i = 0; i < N; i++) { cout << values[i] << " "; } cout << ")的和为" << total << "。" << '\n'; return 0; }
你可以输入测试用例验证溢出逻辑:比如N输入2,再输入2147483647 2 |,程序会正确触发溢出错误提示。
内容的提问来源于stack exchange,提问作者jaylse2
相关产品推荐
相关产品推荐

