为什么左移操作不起作用

时间:2015-11-16 13:03:38

标签: c bitwise-operators

我有以下代码,我们尝试左移某个值的某些位:

int main()
{
   unsigned long mvb = 1;

   mvb << 8;
   printf("The shift value is %u\n", mvb);

   mvb << 56;
   printf("The shift value is %u\n", mvb);
}

但是这两个操作的结果都是1,原因是什么,以及如何正确使用它?

2 个答案:

答案 0 :(得分:4)

你需要在转移后将其分配回mvb:

mvb = mvb << 8;

答案 1 :(得分:3)

%uunsigned long的错误格式说明符,因此程序行为未定义。请改用%lu

请注意,您实际上并没有更改mvb的值:printf来电正在原始值mvb上运行。

mvb <<= 8是修复(这是使用按位左移分配运算符),但要小心不要应用超出类型中位数的移位,因为也是在C中未定义的行为。为避免产生疑问,只有在您将一次移位时才会导致未定义的行为mvb <<= 56的后续移位对于​​64位是正常的类型,但mvb <<= (8 + 56)