C中的二进制到十进制转换器在某个数字后不起作用

Posted

技术标签:

【中文标题】C中的二进制到十进制转换器在某个数字后不起作用【英文标题】:Binary to decimal converter in C doesn't work after a certain number 【发布时间】:2020-07-06 14:51:18 【问题描述】:

我尝试使用 C 制作正二进制到十进制数字转换器,但是当我尝试输入高于 1110011010110001010111(十进制为 3779671)的值时,程序总是返回该确切数字。我当前的任务要求它适用于最多 111111111111111111111111111111 (1073741823) 的二进制数。

到目前为止,我已经尝试将变量类型更改为任何其他可能的更大尺寸,但它似乎不起作用。这是当前代码:

#include <math.h>

void main()

unsigned long long int bi, de = 0;    
unsigned long long int x = 0, bases;  

scanf("%llu", &bi); 

for(x=0 ; bi>0 ; x++, bi=bi/10)
    bases = bi % 10;              
    de = de + bases * pow(2,x);

                       

printf("%llu", de); // imprime o correspondente em decimal


提前感谢您的帮助。

【问题讨论】:

long long int的最大值为18,446,744,073,709,551,615 您没有将二进制值作为字符串读取 - 您正在将其读取为数字为 1 和 0 的数字,但 long long int 具有它可以容纳的最大数字。而是将二进制值作为字符串读取,它将起作用。 啊,明白了,非常感谢!您对如何在字符串上进行整个数学过程有什么建议吗?我想我必须以不同的方式重做,因为我认为我不能只在字符串上使用“%”和“/”运算符。 我会回答的... @Barmar 也许不是maximum value of a long long int is 18,... 看起来像unsigned long long 的常见最大值。 【参考方案1】:

您不需要所有的索引和添加。您可以简单地从右侧移入位:

#include <stdio.h>
#include <string.h>

unsigned long long int bin2dec(const char *string)

    unsigned long long int value = 0;
    while (*string != '\0')
    
        // make room for the next bit by shifting what is there already
        value <<= 1;
        // *string != '0' gives 1 if the current character is not '0', else 0
        value |= *string != '0';
        string++;
    
    return value;


int main(void)

    //                     7  F   C   F   F   4   F   A   F   F   F
    const char * binary = "1111111110011111111010011111010111111111111";
    unsigned long long int decimal = bin2dec(binary);
    printf("%llX\n", decimal);
    return 0;

【讨论】:

【参考方案2】:

无法读取二进制数 111111111111111111111111111111 并将其放入 unsigned long long 整数中,因为 unsigned long long int 的限制为 18446744073709551615,因此您需要将二进制数读取为字符串,然后将每个字符串转换字符改为数字:

#include <stdio.h>
#include <string.h>
#include <math.h>

unsigned long long int bin2dec(const char *string, const size_t size)

    unsigned long long int bit, value = 0;
    for(size_t index=0;index<size;index++)
    
        // moving from the end to the beginning, get a character from the string
        // and convert it from a character containing a digit to a number
        bit = string[size-index-1]-'0';

        // in the original question this was: value += bit*pow(2,index);
        // but we can just do this and get the same effect
        // without multiplication or library function
        value += bit<<index;
    
    return value;


int main()

    const char * binary = "111111111111111111111111111111";
    unsigned long long int decimal = bin2dec(binary, strlen(binary));
    printf("%llu\n",decimal);
    return 0;

在这里试试:https://onlinegdb.com/Skh7XKYUU

【讨论】:

unsigned range 上方的“二进制”代码失败。要使用 unsigned long long 范围,请使用 unsigned long long bit @chux-ReinstateMonica 变量 bit 只是字符串中的一个字符,因此它可以是整数 0 或 1。我不明白为什么它需要比 short 更宽 如果bit&lt;&lt;index 中的index 大于或等于8 * sizeof bit,则结果为0。E1 &lt;&lt; E2 上的C17 标准6.5.7:“如果E1 具有带符号类型和非负值,并且 E1 * 2^E2 在结果类型中是可表示的,那么这就是结果值;否则,行为是未定义的。”用一些更大的输入试试你的程序。 另外,你为什么不从右边逐位移动到结果中呢? @thebusybee 好的,等等 - 所以我真的不明白为什么它应该这样工作的原因,但你是对的 const char * binary = "111111111111111111111111111111"; 返回 0 所以我需要改变它。

以上是关于C中的二进制到十进制转换器在某个数字后不起作用的主要内容,如果未能解决你的问题,请参考以下文章

十进制到十六进制的转换程序不起作用??不知道为啥?

如何在C中检查十六进制数(%x)是否以某个数字开头?

C语言 字符串转数字 急急急

如何将 int 转换为十六进制数并将其打印为 c 中的 3 位数字? [复制]

将科学计数法中的数字转换为十进制[关闭]

Python中的二进制到字符串/文本