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

C++十进制转二进制程序处理较大输入输出异常问题求助

问题根因

  1. 核心错误是decimal_to_binary函数的返回值类型不匹配:函数内部存储二进制结果的ans是long long int类型,但函数声明的返回值为int,返回时会被强制截断为int类型。32位有符号int最大可表示的十进制数为2147483647(仅10位数字),输入1200时对应的二进制序列是10010110000,作为十进制数存储时数值达到100亿级,远超过int的存储上限,发生整数溢出因此输出异常值。
  2. 次要隐患:计算最高位权值的变量x是int类型,当输入的n较大时,x*=2的迭代过程也可能出现int溢出。

修复方案

方案1:最小改动适配现有逻辑

修改函数返回值类型为long long int,同时把权值变量x改为long long int类型避免计算溢出,修改后代码如下:

#include<iostream>
using namespace std;

long long int decimal_to_binary(int n)
{
    long long int x=1;
    long long int ans=0;
    while (x<=n){
        x*=2;
    }
    x/=2;
    while(x>0)
    {
        int lastdigit=n/x;
        n-=lastdigit*x;
        x/=2;
        ans=ans*10+lastdigit;
    }
    return ans;
}

int main()
{
    int input;
    long long int a;
    cout<<"input = ";
    cin>>input;
    a=decimal_to_binary(input);
    cout<<a;
    return 0;
}

注意:该方案仍存在上限,当输入数值的二进制位数超过18位时,对应的十进制表示的ans会超过long long的存储上限,需要处理更大数值建议用二进制字符串存储结果。

方案2:直接输出二进制位(无溢出风险)

不需要把整个二进制序列作为整数存储,计算到每一位直接输出,完全规避整数溢出问题:

#include<iostream>
using namespace std;

void decimal_to_binary(int n)
{
    long long int x=1;
    while (x<=n){
        x*=2;
    }
    x/=2;
    while(x>0)
    {
        cout << n/x;
        n %= x;
        x/=2;
    }
}

int main()
{
    int input;
    cout<<"input = ";
    cin>>input;
    decimal_to_binary(input);
    return 0;
}

内容的提问来源于stack exchange,提问作者user15873758

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:06:05