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
所以看起来在第一个例子中,它操作原始数据的每个班次,而不是操作第一个班次,然后在第一个结果上操作第二个班次。想法?
答案 0 :(得分:11)
计算在int
s完成。在第二种情况下,您将在转回之前分配给res
,它将截断为8位。在第一种情况下,你不是,所以截断不会发生,高位会被保留并向下移回。
答案 1 :(得分:2)
AFAIK,对于按位移位运算符,每个操作数应具有整数类型。你不应该使用 char 类型。
如果你这样做,你会发现不同之处:
res = in << 6;
printf("%p %p \n",res,(in << 6));