C将4位数转换为二进制数

时间:2017-07-28 00:50:28

标签: c recursion binary

我想从20位字段中的文件中打印二进制等效数字,每4位后用空格打印,但是当数字超过1024(我已经测试过这个数字)时,它不再以二进制输出在我不知道的基地(即1234 = 0000 0014 1006 5408)

这是我的代码

#include <stdio.h>
long convertToBinary(long);

int main()
{
    char binNum[20]; //binary number char array
    int i;
    long b, decNum; //b is output binary number, decNum is each input number from file
    FILE *filePtr;
    filePtr = fopen("numbers.txt", "r");
    while (!feof(filePtr))
    {
        fscanf(filePtr, "%li", &decNum);
        if (decNum < 0  || decNum > 65535)
        {
            printf("Error, %5li is out of range.\n", decNum);
            continue;
        }
        b = convertToBinary(decNum); //function call for binary conversion

        i = 18;
        while (i >= 0)
        {
            if (i == 4 || i == 9 || i == 14)
            {
                binNum[i] = ' ';
            }
            else if (b != 0)
            {
                binNum[i] = b % 10 + '0';
                b /= 10;
            }
            else 
            {
                binNum[i] = '0';
            }
            i--;
        }
        binNum[19] = '.';
        printf("The binary representation of %5li is: ", decNum);
        for (i = 0; i<20; i++)
        {
            printf("%c", binNum[i]);
        }
        printf("\n");
    }

return 0;
}

//Recursion function
long convertToBinary(long number)
{
    if (number == 0)
    {
        return 0;
    }
    else
    {
        return (number % 2 + 10 * convertToBinary(number / 2));
    }
}

文件numbers.txt的数字如下:0 1 2 3 16 17 1234 5678 65535

1 个答案:

答案 0 :(得分:3)

您的convertToBinary函数生成十进制编码二进制(而不是二进制编码的十进制),每位使用十进制数字。

看起来long与您系统上的int具有相同的范围,即2 31 ,其中包含十位十进制数字。一旦你得到第十一位数字,就会出现溢出。

切换到具有64位的unsigned long long将解决问题。但是,这是次优的:您最好编写一个二进制转换,将零和一个写入您提供的char数组中。如果您愿意,可以递归地执行此操作,但迭代解决方案可以正常运行。

请注意,to-binary转换不需要在char数组中插入空格。这可以通过main功能完成。