C++二进制转换代码抛出std::out_of_range异常的原因及修复方法
C++二进制加法程序std::out_of_range异常排查修复
问题描述
编写C++代码实现二进制数加法功能:接收用户输入的两个二进制数,通过BinaryToDecimal函数转换为十进制后求和,再通过DecimalToBinary函数将和转换为二进制格式输出,完整代码如下:
#include <iostream> #include <bits/stdc++.h> using namespace std; int BinaryToDecimal(int n) { int ans = 0; int x = 1; while (n > 0) { int y = n % 10; ans = ans + x * y; x = x * 2; n = n / 10; } return ans; } int DecimalToBinary(int num) { vector<int> vect; while (num > 0) { vect.push_back(num % 2); num = num / 2; } int s = vect.size(); int i = s - 1; for (i = s - 1; i >= 0; i--) { cout << vect.at(i); } return vect.at(i); } int main() { int a, b; cout << "Enter first number: " << endl; cin >> a; cout << "Enter second number: " << endl; cin >> b; int a_deci = BinaryToDecimal(a); int b_deci = BinaryToDecimal(b); int sum = a_deci + b_deci; DecimalToBinary(sum); cout << endl; return 0; }
程序运行输出如下:
Enter first number: 10101 Enter second number: 11010 101111terminate called after throwing an instance of 'std::out_of_range'what(): vector::_M_range_check: __n (which is 18446744073709551615) >= this->size() (which is 6)
程序可以输出正确计算结果101111,但输出后立即终止,抛出std::out_of_range类型异常。
错误含义
std::out_of_range是C++标准容器抛出的越界访问异常,代表代码尝试访问容器合法下标范围外的元素。
报错信息里的下标值18446744073709551615是-1转换为64位无符号整数的结果,问题根源在DecimalToBinary函数的最后一行return vect.at(i);:
- for循环终止条件为
i >= 0,每轮循环执行完后会执行i-- - 当循环打印完下标为0的最后一位二进制数后,会再次执行
i--,此时i的值变为-1,循环条件不满足,退出循环 - 紧接着执行
vect.at(i)时,传入的下标-1会被转换为无符号类型的超大值,超出vector的长度范围(本例中vector长度为6),因此触发越界异常。
注:
DecimalToBinary函数的作用仅为打印二进制结果,调用方也没有接收返回值,这行return语句本身是多余的。
修复方案
- 删除
DecimalToBinary函数末尾多余的return vect.at(i);语句 - 将
DecimalToBinary的返回值类型从int改为void,匹配函数仅做输出、不需要返回值的逻辑,同时可以把循环变量i的定义收拢到for循环内部,简化代码。
修复后的DecimalToBinary函数代码:
void DecimalToBinary(int num) { vector<int> vect; while (num > 0) { vect.push_back(num % 2); num = num / 2; } int s = vect.size(); for (int i = s - 1; i >= 0; i--) { cout << vect.at(i); } }
补充说明:当前实现用int类型存储输入的二进制数,支持的二进制长度非常有限,输入较长二进制数时会出现整数溢出问题,若需要支持更长的二进制运算,建议改为用字符串接收输入后直接做二进制加法计算。
内容的提问来源于stack exchange,提问作者Abdullah
相关产品推荐
相关产品推荐

