使用bitshift操作产生奇怪的结果

时间:2011-12-04 18:54:19

标签: c

我试图更好地理解bishift操作,所以我给自己写了一个小程序。

unsigned char a = 240;
a= (a << 3) >> 7;
printf("a: %u\n",a);

现在我想象结果会是这样的:

11110000 // 240
10000000 // << 3
00000001 // >> 7

所以1,但我得到15.我很困惑......感谢任何帮助!

4 个答案:

答案 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;