为什么我得到了错误的二进制模式?

时间:2019-07-11 15:19:53

标签: c bit-manipulation

我正在写一个函数来打印我机器上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") ;
        }
    }
}

1 个答案:

答案 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: 完全有可能将符号移位重新定义为不确定的行为,在这种情况下,您很幸运您的房子没有被烧毁。