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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:31:15