0

如标题所示,我正在尝试将十进制数转换为二进制数。我设置了最低的int,因为我可以

char * toBinary(int num)
{

    int i = 1 << 31;
    while(i!=0)
    {
        if((num & i) == 0 )
            printf("0");
        else
            printf("1");
        i >>= 1;
        printf("%d", i);
        getchar();
    }
}

但它不起作用,每次轮班后i仍然是负数,我应该改变什么?

4

2 回答 2

6

您的代码和您对其功能的描述都存在一些错误。这是一个更正的版本:

void print_binary(unsigned x)
{
    for (unsigned bit = 1u << 31; bit != 0; bit >>= 1)
        putchar((x & bit) ? '1' : '0');
}

错误:

  • 该函数不应该返回char *,因为它不返回任何东西。如果你想创建一个返回字符串的函数,那就不同了。

  • 您无法计算1 << 31,因为那是溢出。您必须使用无符号数:1u << 31没关系(假设int是 32 位)。

  • 您没有从十进制转换为二进制。输入数字已经是二进制的,您只需将其以二进制形式打印出来。

于 2013-10-08T17:18:19.720 回答
3

使用无符号i

int i = 1 << 31;

正确为:

unsigned int i = 1u << 31;

另外,31我建议您不要使用与大小无关的代码(int 的大小在不同的机器上可能不同),而不是使用。

喜欢:

unsigned int mask = 1u << ((sizeof(unsigned int) * CHAR_BIT) - 1);   

mask取而代之i的是,写成这样的代码。

//conversion 
unsigned int mask = 1u << ((sizeof(unsigned int) * CHAR_BIT) - 1);   
while(mask > 0){
  if((num & mask) == 0 )
       printf("0");
  else
       printf("1")
   mask = mask >> 1 ;  // Right Shift 
}

来自@Carl Norum的评论:要正确编写与平台无关的大小代码,请使用 头文件中CHAR_BIT定义的宏。limits.h请注意CHAR_BIT其中的位数char,在 C 的某些实现中,一个字节可能等于 8 位。

阅读:什么是CHAR_BIT

于 2013-10-08T17:18:11.400 回答