C++十进制转二进制程序处理较大输入输出异常问题求助
问题根因
- 核心错误是
decimal_to_binary函数的返回值类型不匹配:函数内部存储二进制结果的ans是long long int类型,但函数声明的返回值为int,返回时会被强制截断为int类型。32位有符号int最大可表示的十进制数为2147483647(仅10位数字),输入1200时对应的二进制序列是10010110000,作为十进制数存储时数值达到100亿级,远超过int的存储上限,发生整数溢出因此输出异常值。 - 次要隐患:计算最高位权值的变量
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
相关产品推荐
相关产品推荐

