当 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
可以看出 3552
与 11100000
不同。
所以这个语句的输出
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
我无法理解为什么 '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
可以看出 3552
与 11100000
不同。
所以这个语句的输出
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