Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 十进制到二进制错误输出_C_Binary_Bit Shift - Fatal编程技术网

C 十进制到二进制错误输出

C 十进制到二进制错误输出,c,binary,bit-shift,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); int输入; scanf(“%d”,输入(&I)); 对于(int i=sizeof(int)*字符位-1;i>=0;i--) printf(“%u”),(输

我尝试用以下两种方法以二进制形式打印数字:

方法1:

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

for(int i = sizeof(int)*CHAR_BIT - 1; i >= 0; i--)
printf("%u",(input & (1<<i)) >> i);
int输入;
scanf(“%d”,输入(&I));
对于(int i=sizeof(int)*字符位-1;i>=0;i--)
printf(“%u”),(输入和(1 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');
int输入;
scanf(“%d”,输入(&I));
对于(int i=sizeof(int)*字符位-1;i>=0;i--)

(input&(1使用无符号类型,并注意i>=0比较。因为无符号类型始终>=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") ;
无符号整数输入;
scanf(“%u”,&input);
对于(无符号整数i=sizeof(int)*8-1;;i--){
printf(“%u”),(输入和(1u i);
如果(i==0)中断;
}
printf(“\n”);

使用无符号类型并注意i>=0比较。因为无符号类型始终>=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") ;
无符号整数输入;
scanf(“%u”,&input);
对于(无符号整数i=sizeof(int)*8-1;;i--){
printf(“%u”),(输入和(1u i);
如果(i==0)中断;
}
printf(“\n”);

使用有符号数字进行位移位是没有意义的。当您将数据移位到
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);
}
uint32\u t输入=0x88776655;

对于(uint32_t i=0;i使用有符号数字进行位移位是没有意义的。当您将数据移位到
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);
}
uint32\u t输入=0x88776655;

对于(uint32_t i=0;i在处理位之前通过强制转换为无符号类型来解决此问题

printf("%u", ((unsigned int)input & (1 << i)) >> i);
printf(“%u”),((无符号整数)输入和(1>i);

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

printf("%u", ((unsigned int)input & (1 << i)) >> i);
printf(“%u”),((无符号整数)输入和(1>i);

处理位时,不要使用有符号类型。
1处理位时,不要使用有符号类型。
1此代码也会调用未定义的行为,就像原始代码一样。也就是说,当
i
为31时,您会调用
1此代码也会调用未定义的行为,就像原始代码一样。也就是说,当
i
为31时,您会调用未定义的行为u do
1
1
1