我试图更好地理解bishift操作,所以我给自己写了一个小程序。
unsigned char a = 240;
a= (a << 3) >> 7;
printf("a: %u\n",a);
现在我想象结果会是这样的:
11110000 // 240
10000000 // << 3
00000001 // >> 7
所以1,但我得到15.我很困惑......感谢任何帮助!
答案 0 :(得分:9)
您的问题是此声明:(a << 3)
将输入转换为int
。所以此时你有240 * 2 ^ 3 = 1920
00000000000000000000011110000000
然后,您将之前的结果除以2 ^ 7 = 128
,以便:15
00000000000000000000000000001111
这正是你得到的结果。
如果你想截断你可以使用的位:
printf("a: %u\n",a & 1); //get only last bit so you would have 1 as a result!
printf("a: %u\n",a & 255); //get all 8 bits
希望这有帮助!
答案 1 :(得分:3)
表达式被评估为(无符号)整数。 (默认为int promotion)。仅在最终赋值之前才会将(截断)转换为较窄类型。
答案 2 :(得分:3)
当你移位时,它将a
转换为大于8位的整数类型,因此保存了前4位
#include <stdio.h>
int main() {
unsigned char a = 240;
a = (a << 3);
a = (a >> 7);
printf("a: %u\n",a);
return 0;
}
打印1
答案 3 :(得分:1)
虽然移动类型会自动提升为int,这比char(最常见)更宽。所以,它可以存储你所有的位。
要获得你所期望的,你必须做的事
a = a << 3;
a = a >> 7;
或
a = ((unsigned char)(a << 3)) >> 7;