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

10-11 21:24