在标题中我试图将十进制数转换为二进制数。 我设置了最低的int as coudl
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
仍为负数,我改变了什么?
答案 0 :(得分:5)
您的代码和您的代码描述都有几个错误。这是一个更正版本:
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位)。
您没有从十进制转换为二进制。输入数字已经是二进制的,您只需将其打印成二进制文件。
答案 1 :(得分: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位。