按位左移意外结果

时间:2013-05-07 16:21:39

标签: c bit-manipulation bit

当我尝试左移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);
}

2 个答案:

答案 0 :(得分:4)

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

来自topic:ISO C99(6.5.7 / 4)的相关引用

  

E1的结果&lt;&lt; E2是E1左移E2位位置;腾出的位用零填充。如果E1具有无符号类型,则结果的值为E1×2 E2 ,减少模数   比结果类型中可表示的最大值多一个。如果E1有签名   类型和非负值,E1×2 E2 在结果类型中可表示,那么   结果价值;否则,行为未确定

答案 1 :(得分:2)

假设你有32位整数,左移31次以上的结果是未定义的

来自C11 §6.5.7 Bitwise shift operators

  

E1的结果&lt;&lt; E2是E1左移E2位位置;腾空   位用零填充。如果E1具有无符号类型,则值为   结果是E1 x 2E2,比最大值减少了一个模数   值可在结果类型中表示。如果E1有签名类型和   非负值,E1 x 2E2可在结果类型中表示,   那就是结果价值;否则,行为是   未定义。