当我尝试左移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);
}
答案 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可在结果类型中表示, 那就是结果价值;否则,行为是 未定义。