1

当我尝试左移 32 次时,我发现了一些连线问题。测试函数中的代码应该打印相同的结果 0x0,但我得到的是“ffffffff, 0”。任何人都可以提示代码有什么问题?谢谢!

int test(int n) {
    int mask = ~0 << (32 + ~n + 1);
    int mask1 = ~0 << (32 + ~0 + 1);
    printf("%x, %x\n", mask, mask1);
    return mask;
}

int main(){
    test(0);
}
4

2 回答 2

4

在 C 中,大小大于类型大小(int在您的情况下)的移位是未定义的行为

来自这个主题:来自 ISO C99 (6.5.7/4) 的相关引用

E1 << E2 的结果是 E1 左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1 × 2 E2,比结果类型中可表示的最大值多模一减少。如果 E1 有带符号类型和非负值,并且 E1 × 2 E2在结果类型中是可表示的,那么这就是结果值;否则,行为未定义

于 2013-05-07T16:23:42.977 回答
2

假设你有 32 位整数,左移超过 31 次的结果是不确定的

从 C11§6.5.7 Bitwise shift operators

E1 << E2 的结果是 E1 左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1 x 2E2 ,以比结果类型中可表示的最大值多一个模数减少。如果 E1 具有带符号类型和非负值,并且 E1 x 2E2 在结果类型中是可表示的,那么这就是结果值;否则,行为未定义。

于 2013-05-07T16:25:09.687 回答