C中的位移运算符优先级

Bal*_*sar 4 c operator-precedence

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

unsigned char in = 155;
unsigned char res;

res = (in << 6) >> 7;
Run Code Online (Sandbox Code Playgroud)

应该是一样的

res = in << 6;
res = res >> 7; // can also use res >>= 7;
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.

第一个结果是:

in  = 10011011
res = 01001101
Run Code Online (Sandbox Code Playgroud)

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

in  = 10011011
res = 00000001
Run Code Online (Sandbox Code Playgroud)

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

kes*_*lam 11

计算在ints 中完成.在第二种情况下res,在转回之前,您将分配到,将截断为8位.在第一种情况下,您不是,因此不会发生截断,并且保留高位并向下移回.