来自同一行的多个按位移位的意外行为

时间:2014-08-19 21:12:59

标签: c bit-manipulation

我会得到一个不同的结果,具体取决于我是在一条线上组合多个按位移位还是将它们放在不同的行上。

unsigned char a = 73;
a = (a << 6) >> 2;
printf("%d\n", a);
当我期望16

时,

打印144

unsigned char a = 73;
a = a << 6;
a = a >> 2;
printf("%d\n", a);

打印预期的16

结果

当我向左移动6,然后在一行右移1时,它打印出预期的32的结果,所以它 看起来第二档右移1而不是0,但为什么呢?

另外

a = (unsigned char) (a << 6 ) >> 2;

产生预期结果(16)。

第一个左移是返回一个有符号的char而不是一个unsigned char,如果是,为什么?

1 个答案:

答案 0 :(得分:4)

是的,第一班的结果已签署。 signed int具体而言。查看C规范中“整数促销”的规则:

  

如果 int 可以代表原始类型的所有值...则该值会转换为 int ... < / p>

所以,因为你的int - 通常是[-2 31 ,2 31 )的范围 - 可以代表{{1}的所有值} - 通常为[0,255] - 它已转换为unsigned char,而int<<会在结果值上发生。