1

当我通过时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 上运行

4

2 回答 2

4

对 32 位值左移 32 位会产生未定义的结果。您只能移动 0 到 31 位。

另见此处:为什么 32 位整数的左位移“<<”在使用超过 32 次时不能按预期工作?

于 2012-08-16T13:02:41.507 回答
2

这是C11 草案 §6.5.7.3的相关引用;

如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

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

于 2012-08-16T13:02:55.337 回答