【问题标题】:Wrong outputs in Decimal to binary conversion after input of 1024?输入 1024 后十进制到二进制转换的输出错误?
【发布时间】:2019-09-28 12:53:23
【问题描述】:

我的代码在 1024 之前都可以正常工作,但是大于 1024 的值会给出错误的输出,请帮助:

#include<stdio.h>

int main()
{
    int dec,i=1;
    int rem=0;
    long long int result=0;

    scanf("%d",&dec);

    while(dec!=0)
    {
        rem=dec%2;
        result = result +rem*i;

        dec=dec/2;
        i=i*10;

    }
    printf("%I64u",result);

    return 0;
}

【问题讨论】:

  • 请不要将您的十进制到二进制转换器编写成将其输出存储在int 中。它不仅人为地限制了您可以转换的数字范围,而且毫无意义。请编写您的转换器以将其输出存储为 string。这样会好很多。
  • 1024 对于 int 来说太大了。 1024=0b10000000000。现在您正尝试在 long long 中存储 10000000000。这没关系,但您使用 int 变量进行计算。
  • 从编程语言的角度来看,二进制和十进制都是文本格式。变量dec 不是十进制的。这只是一个值。该代码使用scanf 将控制台中的文本翻译为数值。将该值转换为二进制(或任何其他)文本表示的函数应该以文本的形式产生结果。

标签: c++ c error-handling


【解决方案1】:

代码应在字符串中累积二进制值。由于这是交叉发布到 C 和 C++,我想 C 解决方案是合适的(在 C++ 中我会使用 std::string,并且记账会更简单一些):

#include<stdio.h>

int main()
{
int rem=0;
char result[sizeof(long long)*CHAR_BITS+1];
int dec,i=sizeof(result);
result[--i] = '\0';

scanf("%d",&dec);
while(dec!=0)
{
    rem=dec%2;
    result[--i] = rem + '0';
    dec=dec/2;
}
printf("%s",result + i);

return 0;

}

(注意:未测试)

【讨论】:

    【解决方案2】:

    你来了

    #include <stdio.h>
    
    int main(void) 
    {
        int dec = 0;
        long long int i = 1;
        long long int result = 0;
    
        scanf( "%d", &dec );
    
        do
        {
            int rem = dec % 2;
            result = result + rem * i;
    
            i *= 10;
    
        } while ( dec /= 2 );
    
        printf( "%I64u", result );
    
        return 0;
    }
    

    问题是变量i 被声明为具有int 类型。因此,表达式i *= 10 或表达式rem * i 的结果值将被计算为int 类型的对象,而不是long long int 类型的对象。

    如果输入1024那么输出是

    10000000000
    

    一般来说,您的方法是错误的,因为 long long int 类型的大小在任何情况下都受到限制,并且无法以二进制表示法表示所有可能的整数值。

    您可以使用字符或整数数组来代替 long long int 类型的对象。

    【讨论】:

    • 这并没有解决一般的溢出问题。它只是将可能的溢出推到更高的值。当intlong long 大小相同时,考虑翻译INT_MAX...
    • @PeteBecker 是的,但很明显他应该使用他的方法限制输入值的范围我回答了他的问题,为什么对于值 1024 他得到无效的结果。
    • 嗯,当然。并且使用原始代码,限制应该是输入小于 1024。瞧:问题已按定义修复。但它仍然存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多