c++ - 这个 C++ 十进制到二进制转换代码有什么问题?
问题描述
对于某些值(如 9),它可以完美运行,但对于大多数值(如 7、19 或 6),它会从返回(二进制)值中减去 1。
#include<iostream>
#include<cmath>
using namespace std;
int decimaltobinary(int);
int main()
{
int num;
cout<<"Enter the number: ";
cin>>num;
cout<<num<<" in decimal = "<<decimaltobinary(num)<<" in binary.";
return 0;
}
int decimaltobinary(int num)
{
int remainder,i=0,binary=0;
while(num!=0)
{
remainder=num%2;
num=num/2;
binary=binary+remainder*pow(10,i);
i++;
}
return binary;
}
解决方案
显示的代码有两个主要问题:
- 所示代码尝试构建十进制输入数字的二进制版本,例如
111
数字 7 的结果。这是一个 111 的整数值。
在 32 位平台上,使用 32 位整数意味着可以通过这种方式“转换”为十进制的最大数字是 2047。2048 是二进制的 10000000000,这将超过 32 位整数的容量。一个无符号的 32 位整数的最大值是 4294967295(其中一半是普通的有符号int
值,但无论有符号还是无符号,此时你都没有气了)。
- 默认情况下,使用
pow()
两个整数值会自动破坏,因为浮点数学被破坏。这不是pow()
真正的做法。以下是它的pow()
作用:a) 它取其第一个参数的自然对数,b) 将步骤 a 的结果乘以其第二个参数,c) 提高e
到步骤 b 的幂。这听起来像你期望在这里做的事情吗?
由于pow()
采用浮点参数,结果是浮点数,因此显示代码的最终结果是浮点和整数值之间的一堆不必要的转换,以及由于浮点指数数学不精确导致的非特定舍入错误.
但是所示代码中的主要缺陷是尝试使用普通int
s 来组装表示二进制值的十进制数,而二进制值根本没有足够的位数。切换到long long int
不会有太大帮助。用我的手指数数,那样的话,你只能上升到一百万以北的某个地方。对于所描述的编程任务,必须采用完全不同的方法。
推荐阅读
- ios - UITableView 上的 tvOS 焦点引擎,将 UICollectionViews 作为单元格
- eclipse - 如何使用 Eclipse AST 解析器生成控制流图?
- vim - 将 foldmethod 更改为 diff 后如何在 Vim 中保存折叠?
- visual-studio - 团结运动翻转
- python - 抓取数据并将其组合以形成单个变量
- java - Java Stream 将 JSON 列表聚合成组
- html - HTML Element/Div is narrowing in response to decreased screen width
- sql - 具有多个选择行的材质 UI 表
- leaflet - L.CRS.Simple 的传单最低缩放级别仍然太高
- reactjs - react-beautoful-dnd 中的目标 droppableId 问题。接收到错误的目标可丢弃 id