【问题标题】:C Converting 4 digit numbers to binaryC将4位数字转换为二进制
【发布时间】:2017-07-28 20:26:48
【问题描述】:

我想在 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

【问题讨论】:

  • 对不起,数字是 0 1 2 3 16 17 1234 5678 65535,1234 的输出应该是 0000 0100 1101 0010 但是 0000 0014 2107 5418
  • 您的convertToBinary() 函数溢出了可以存储在long 中的值。转换为以 10 为底的数字以便您可以打印内容是不寻常的。
  • 在二进制数字计算机中,一切都已经是二进制形式了。将long 转换为long 没有意义。作为旁注:不要使用递归。这只有不编写实际代码的计算机科学理论教授喜欢。
  • @Olaf 作为旁注:除非您用广告以外的其他东西来支持它们,否则不要做出笼统的陈述。只有政客才能做到这一点。 ...等等,当吉特。
  • @QPaysTaxes:哦,该声明的资金充足,来自 ca 的个人和交流经验。现在30年了。也许“教授”有点过于严格了;还有其他理论 Cs ppl 认为递归是哥伦布的鸡蛋。 IRL,在 C 和其他命令式语言中,它通常没什么用。在嵌入式编程中,一些编码标准甚至明确禁止它们。顺便说一句:这不是一个论点,而是一个陈述,所以它不能是“(argumentum)ad hominem”。并且应该明确陈述总是是主观的;否则它们就是事实。 (不过,我可能错过了这个笑话)

标签: c recursion binary


【解决方案1】:

您的 convertToBinary 函数正在生成一个十进制编码的二进制(与二进制编码的十进制相反),它使用每位十​​进制数字。

看起来long 与您系统上的int 具有相同的范围,即231,涵盖十进制数字。一旦你得到第十一个数字,你就会溢出。

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

注意转二进制不需要在char数组中插入空格。这可以通过您的 main 函数来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2014-04-15
    • 2021-12-05
    • 2021-01-11
    • 2016-04-30
    • 2014-10-17
    • 2015-05-18
    相关资源
    最近更新 更多