十进制到二进制错误输出

时间:2018-03-19 10:14:19

标签: c binary bit-shift

我正试图用这两种方法打印二进制数字:

方法1:

int input;
scanf("%d", &input);

for(int i = sizeof(int)*CHAR_BIT - 1; i >= 0; i--)
printf("%u",(input & (1<<i)) >> i);

方法2:

int input;
scanf("%d", &input);

for(int i = sizeof(int)*CHAR_BIT - 1; i >= 0; i--)
(input & (1<<i)) ? putchar('1') : putchar('0');

方法2工作正常,但在方法1中,打印的第一个“数字”是4294967295,我找不到错误。

3 个答案:

答案 0 :(得分:2)

使用带符号的数字进行位移是没有意义的。将数据移入int的符号位时,将调用未定义的行为。另请注意,1文字的类型为int

通过使用无符号类型解决这个问题并同时删除na(t)ive C类型,这有利于stdint.h。

uint32_t input = 0x88776655;

for(uint32_t i=0; i<32; i++)
{
  printf("%u", (input & (1u<<31-i)) >> 31-i);
}

答案 1 :(得分:0)

使用无符号类型并注意i&gt; = 0比较。因为无符号类型总是&gt; = 0。它不能是负数。

unsigned int input;
scanf("%u", &input);
for(unsigned int i = sizeof(int)*8 - 1; ; i--) {
    printf("%u",(input & (1u<<i)) >> i);
    if ( i==0 ) break ;
}
printf("\n") ;

答案 2 :(得分:0)

通过在使用位之前转换为无符号类型来解决此问题。

printf("%u", ((unsigned int)input & (1 << i)) >> i);