向左移动可变错误

时间:2015-06-06 01:17:56

标签: c++ c undefined-behavior bit-shift bitmask

我正在尝试创建一个掩码,但是当我计算shift的值并将其放入变量时,我得到了错误的结果。看:

#include <stdio.h>

int main(){
        int shift = 32 ;
        printf("%d\n",shift);   //32
        int mask = 0xFFFFFFFF << shift;
        printf("%x\n",mask);     //ffffffff      
        mask = 0xFFFFFFFF << 32;
        printf("%x\n",mask); //00000000
        return 0;
}

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:4)

如果您的系统具有32位或更小的int,那么您可以通过移位32位或更多位置来undefined behaviour。移位的位数必须少于类型的位数。

如果你有64位int,那么0xFFFFFFFF将是一个有符号的int,并且将它移位32位会将1移动到符号位,这会在C和C ++中导致UB在C ++之前14。 (因为C ++ 14会导致实现定义的行为)。

如果在64位情况下按计划进行转换,

printf("%x\n",mask);也会触发UB,因为%x需要非负值,但您传递的是负int。为避免这种情况,请改用unsigned int mask

当您触发UB时,可能会发生任何事情,包括但不限于无意义输出,以及相同的操作会产生不同的结果。