Двоичный в десятичный преобразователь в C не работает после определенного числа - PullRequest
0 голосов
/ 26 марта 2020

Я пытался сделать положительное двоичное число в преобразователь десятичных чисел, используя 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

}

Спасибо за помощь заранее.

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Вам не нужно все это индексирование и добавление. Вы можете просто сдвинуть биты справа:

#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;
}
0 голосов
/ 26 марта 2020

Вы не можете прочитать двоичное число 111111111111111111111111111111 и поместить его в длинное целое число без знака, потому что предел для длинного длинного целого без знака равен 18446744073709551615, поэтому вам нужно прочитать двоичное число как строку символов и затем преобразовать каждое символ цифры c di git вместо:

#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

...