我正在写一个函数来打印我机器上4字节整数的二进制表示形式。
我正在创建一个mask = 0x80000000
( 10000000 00000000 00000000 00000000 )
并创建一个循环来正确移动此蒙版并进行and
操作,如果是一个,我将打印1,否则我将打印0,但是结果错误!
例如:对于十进制10,我得到00000000 00000000 00000000 00001111
。
#include <stdio.h>
void Binary( int ) ;
int main()
{
Binary(10) ; // 00000000 00000000 00000000 00001111
while(1);
return 0;
}
void Binary( int num )
{
int mask = 0x80000000 ;
for(int i = 0 ; i<32; i++)
{
if( (mask>>i)&num )
{
printf("1") ;
}
else
{
printf("0") ;
}
}
}
最佳答案
当您将int右移时,因为它是带符号的,所以它将用符号位填充。所以0x80000000 >> 1是0xc0000000; >> 2是0xe0000000; >> 23是0xffffffff; >> 31是0xffffffff。
值10是二进制数1010,因此对于28、29、30、31中的每个i,它的值都为非零。
您可以通过修改程序以尝试一些不同的数字来进行测试:
4: 00000000000000000000000000000111
8: 00000000000000000000000000000111
15:00000000000000000000000000001111
16:00000000000000000000000000011111
如评论所述,如果您切换到未签名,则不会发生。
ps:
完全有可能将符号移位重新定义为不确定的行为,在这种情况下,您很幸运您的房子没有被烧毁。
关于c - 为什么我得到了错误的二进制模式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56992517/