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=0x8000000代码>UB?将int
范围外的值赋给int
?@EOF我认为溢出是UB,屏蔽/移位是ID。@chux C11标准草案n1570:6.3转换6.3.1.3有符号和无符号整数3否则,新类型是有符号的,并且不能在其中表示值;要么结果是实现定义的,要么发出一个实现定义的信号。@没错。