当 unsigned char 与 11100000 进行或运算时,为什么按位或运算无法按预期工作?

Why is bitwise OR operation not working as expected when an unsigned char is ORed with 11100000?

我无法理解为什么 'c | 11100000' 操作似乎不起作用。但我也注意到 'c | 10000000' 按预期工作。

#include <stdio.h>

int main()
{
    unsigned char c, c1;
    
    c = c & 0;
    c = c | 11100000;
    printf("%o \t", c);
    
    /** prints 140 ***/
    
    
    c = c & 0;
    c = c | 111;
    c << 5;
    printf("%o", c);
    
    /** prints 157 **/

    return 0;
}

您使用的常量值是十进制格式,而不是二进制格式。

C 不支持二进制常量,但支持十六进制常量:

c = c | 0xe0;
...
c = c | 0x7;

此外,这没有任何作用:

c << 5;

据推测,您想要:

c = c << 5;

混淆的问题是你认为这个整型常量11100000代表一个二进制字面量。即1和0是位值。

但是如果你要执行这条语句

printf( "11100000 = %x\n", 11100000 );

你会看到常量的十六进制表示是a95f60

11100000 = a95f60

所以在这个声明中

c = c | 11100000;

等于0x60(或十进制96)的低位字节被分配给变量c

写不一样

c = c | 111;
c <<= 5;

另外注意这个表达式语句

c << 5;

没有效果。看来你的意思是

c <<= 5;

这相当于将十进制值 111 乘以 32,然后再次将较低有效字节分配给变量 c

如果你会执行这条语句

printf( "111 << 5 = %d\n", 111 << 5 );

那么你会看到结果是

111 << 5 = 3552

可以看出 355211100000 不同。

所以这个语句的输出

c = 111 << 5;
printf( "%d\n", c);

是十进制224.

与 C++ 相反,C 中没有整数二进制常量。

在C++中有二进制字面量,你可以得到预期的结果运行这个程序

#include <cstdio.h>

int main()
{
    unsigned char c = 0;
    c = c | 0b11'100'000;
    printf( "%o\t", c );

    c = 0b111;
    c <<= 5;
    printf( "%o\n", c );
}

程序输出为

340     340