C 为什么可以';我不能正确地用二进制打印这个数字吗?

C 为什么可以';我不能正确地用二进制打印这个数字吗?,c,binary,C,Binary,我想用下面的程序打印一个数字,但它从来没有正确打印过,我也找不到问题,你能帮我吗 #include <stdio.h> int main(){ int value=3; int mask=0x80000000; int byte=0; int bit=0; for(byte=0; byte<4; byte++){ for(bit=0; bit<8; bit++){ if(value&

我想用下面的程序打印一个数字,但它从来没有正确打印过,我也找不到问题,你能帮我吗

#include <stdio.h>

int main(){

    int value=3;
    int mask=0x80000000;
    int byte=0;
    int bit=0;

    for(byte=0; byte<4; byte++){

        for(bit=0; bit<8; bit++){

            if(value&mask==1)
                printf("1");
            else
                printf("0");

             mask>>=1;
        }
        printf(" ");
    }
    printf("\n");
    return 0;
}
#包括
int main(){
int值=3;
int mask=0x8000000;
int字节=0;
int位=0;
对于(字节=0;字节=1;
}
printf(“”);
}
printf(“\n”);
返回0;
}

您的代码还有其他问题,但主要问题是您的
if
语句

if (value & mask == 1)
有两个问题:

  • =
    散列的优先级高于
    &
    ,因此这被解析为好像您编写了
    值和(掩码==1)
    。但是您希望先进行掩码,然后进行比较,因此您必须编写
    (值和掩码)==1

  • 当您进行屏蔽时,通常不会得到
    1
    。设置屏蔽位时,您将得到该位中带有
    1
    的数字,而不是最低位。使用
    ==1
    ,而不是使用
    !=0
    查看位是否已设置。您还可以使用
    (值和掩码)==mask

  • 当您将该行更改为:

    if ((value & mask) != 0)
    
    它通常会起作用


    但是,您的代码具有实现定义的行为,因为您正在对有符号整数变量执行位操作。在32位系统上,
    0x8000000
    溢出了
    int
    的最大值,并且执行有符号数的移位是实现定义的。请将
    value
    mask
    更改为
    unsigned int和一切都应该很好。

    您可能想了解余数(
    %
    )和按位and(
    &
    )运算符之间的差异。以及如何在C中计算条件。它使用
    无符号
    来屏蔽(用于逻辑移位,而不是算术移位)。了解运算符优先级。并在编译器中启用完整警告。@pedrossantos,因为在32位计算机上
    0x8000000
    溢出
    signed int
    。1)使用
    unsigned
    而不是
    int
    。2)
    if(value&mask==1)
    -->
    if(value&mask)
    所有相关问题都不会导致未定义的行为。这是所有定义的实现。@EOF,不是
    int mask=0x8000000UB?将
    int
    范围外的值赋给
    int
    ?@EOF我认为溢出是UB,屏蔽/移位是ID。@chux C11标准草案n1570:6.3转换6.3.1.3有符号和无符号整数3否则,新类型是有符号的,并且不能在其中表示值;要么结果是实现定义的,要么发出一个实现定义的信号。@没错。