首页 > 解决方案 > 这个 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;
} 

标签: c++binarydecimaldata-conversion

解决方案


显示的代码有两个主要问题:

  1. 所示代码尝试构建十进制输入数字的二进制版本,例如111数字 7 的结果。这是一个 111 的整数值。

在 32 位平台上,使用 32 位整数意味着可以通过这种方式“转换”为十进制的最大数字是 2047。2048 是二进制的 10000000000,这将超过 32 位整数的容量。一个无符号的 32 位整数的最大值是 4294967295(其中一半是普通的有符号int值,但无论有符号还是无符号,此时你都没有气了)。

  1. 默认情况下,使用pow()两个整数值会自动破坏,因为浮点数学被破坏。这不是pow()真正的做法。以下是它的pow()作用:a) 它取其第一个参数的自然对数,b) 将步骤 a 的结果乘以其第二个参数,c) 提高e到步骤 b 的幂。这听起来像你期望在这里做的事情吗?

由于pow()采用浮点参数,结果是浮点数,因此显示代码的最终结果是浮点和整数值之间的一堆不必要的转换,以及由于浮点指数数学不精确导致的非特定舍入错误.

但是所示代码中的主要缺陷是尝试使用普通ints 来组装表示二进制值的十进制数,而二进制值根本没有足够的位数。切换到long long int不会有太大帮助。用我的手指数数,那样的话,你只能上升到一百万以北的某个地方。对于所描述的编程任务,必须采用完全不同的方法。


推荐阅读