在C中将十进制数转换为二进制数

时间:2015-05-06 23:15:23

标签: c

我正在尝试将十进制数转换为二进制数,但我最终得到'随机'ASCII符号作为输出。这是我的计划:

#include <stdio.h>

int main()
{
    int number = 0;
    int i = 50;
    char binary[10];
    printf("Enter a number: ");
    scanf("%d", &number);
     while(number!=0){
         binary[i] = number % 2;
         i--;
         number = number / 2;
    }
    printf("\n%s", binary);

    return 0;
}

4 个答案:

答案 0 :(得分:3)

您的代码存在多个问题(没有特定的订单,但我找到了它们):

  • 您正在初始化char intbinary[i] = number % 2;你应该正确地将整数转换为一个字符,如下所示:

    binary[i] = '0' + (number % 2);
    
  • 您正在撰写printf("\n%s", binary);,其中binarychar[10],因此不一定是空终止的。您应该再向binary添加一个字符并将其初始化为\0

    char binary[11];
    binary[10] = '\0';
    
  • 您错误地初始化了数组:首先是i = 50binary[10]。你应该添加一个常量并使用它两次:

    #define MAX_SIZE 32
    int i = MAX_SIZE - 1;
    char binary[MAX_SIZE + 1];
    binary[MAX_SIZE] = '\0';
    

    请注意您忘记的-1,这样可以避免在字符串结尾后写字,而+1基本上是最后一个问题

  • 您正在阅读int并尝试获取其二进制表示形式;但负值的(真)二进制表示通常不是你所期望的。喜欢阅读unsigned int

    unsigned int number;
    scanf("%u", &number);
    
  • 您可以将number % 2替换为number & 1,将number /= 2替换为number >>= 1;这更能代表您在number上运行的(二进制)操作。此外,这应该在负整数上正常工作,你的版本不应该(未经测试,无论如何你通常没有理由想要得到负整数的二进制表示):

    binary[i--] = '0' + (number & 1);
    number >>= 1;
    
  • 您的号码为零后停止,但这意味着您不一定要填充binary数组;这意味着您可能在binary的开头有未初始化的字符(在调试模式下的VC ++上,这应该将IIRC显示为ÿ个字符)。你应该在你的循环后添加这样的东西,以便填充数组:

    while (i >= 0)
        binary[i--] = '0';
    

希望有所帮助!

答案 1 :(得分:1)

您将i初始化为50,但二进制缓冲区的长度仅为10个字符。所以你没有在循环中填充正确的元素。

答案 2 :(得分:1)

#include <stdio.h>
#define MAX_SIZE 32

int main()
{
    unsigned int number = 0;
    int i = MAX_SIZE - 1;
    char binary[MAX_SIZE + 1];
    binary[MAX_SIZE] = '\0';
    printf("Enter a number: ");
    scanf("%u", &number);

    while(number!=0)
    {
        binary[i--] = '0' + (number & 1);
        number >>= 1;
    }

    while (i >= 0)
        binary[i--] = '0';
    printf("\n%s", binary);
}

希望这会有所帮助......

答案 3 :(得分:0)

您正在从后面到前面填充阵列。一旦数字#34;完成&#34;就停止,并且不要&#34;左边的垫#34;数组开头的剩余字符,因此它们未初始化。要么在开始时将整个数组初始化为'0',要么添加如下内容:

while(i >= 0) {
    binary[i] = '0';
    i--;
}

最后。 (我想我已经初始化为&#39; 0&#39;)。您还需要确保buffer足够大(50,而不是10)。并插入字符,而不是整数:binary[i] = '0' + (number % 2);