C中的位移运算符优先级

时间:2014-03-19 06:25:38

标签: c operator-precedence

C中的位移操作符没有按照我的预期运行,这无疑是我的误解,但有人可以解释发生了什么吗?

unsigned char in = 155;
unsigned char res;

res = (in << 6) >> 7;

应与

相同
res = in << 6;
res = res >> 7; // can also use res >>= 7;

但事实并非如此。

第一个结果是:

in  = 10011011
res = 01001101

第二个(如预期的那样):

in  = 10011011
res = 00000001

所以看起来在第一个例子中,它操作原始数据的每个班次,而不是操作第一个班次,然后在第一个结果上操作第二个班次。想法?

2 个答案:

答案 0 :(得分:11)

计算在int s完成。在第二种情况下,您将在转回之前分配给res,它将截断为8位。在第一种情况下,你不是,所以截断不会发生,高位会被保留并向下移回。

答案 1 :(得分:2)

AFAIK,对于按位移位运算符,每个操作数应具有整数类型。你不应该使用 char 类型。

如果你这样做,你会发现不同之处:

res = in << 6;
printf("%p %p \n",res,(in << 6));