C中的位移,意外的结果

时间:2012-08-16 12:56:48

标签: c bit-manipulation

当我通过n = 0x0时,我在屏幕上显示0xffffffff 我期望的应该是0x00000000 当我按32 bits移动单词时 (只是忽略x!我没有在函数中使用它。)

void logicalShift(int x, int n) {
    int y = 32;
    int mask = 0xffffffff;
    printf("mask %x", mask << (y-n));
}

其中一个有趣的观点是

void logicalShift(int x, int n) {
    int y = 32;
    int mask = 0xffffffff;
    printf("mask %x", mask << 32);
}

这将输出我的预期。我错过了什么吗? 谢谢!

我在ubuntu上运行

2 个答案:

答案 0 :(得分:4)

32位值上的32位左移具有未定义的结果。您只能将0到31位移位。

另见:Why doesn't left bit-shift, "<<", for 32-bit integers work as expected when used more than 32 times?

答案 1 :(得分:2)

以下是C11 draft §6.5.7.3;

的相关引用
  

如果右操作数的值为负或大于或   等于提升的左操作数的宽度,行为是   理解过程科幻奈德。

换句话说,结果是未定义的,编译器可以自由生成任何结果。