我正在写一个函数来打印我机器上4字节整数的二进制表示形式。
我正在创建一个mask = 0x80000000
( 10000000 00000000 00000000 00000000 )
并创建一个循环以右移此掩码并进行and
操作,如果是该操作,我将打印1,否则我将打印0,但是结果错误!
例如:对于十进制十,我得到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") ;
}
}
}
答案 0 :(得分:1)
当您将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: 完全有可能将符号移位重新定义为不确定的行为,在这种情况下,您很幸运您的房子没有被烧毁。