我正在尝试创建一个掩码,但是当我计算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;
}
有人知道为什么会这样吗?
答案 0 :(得分:4)
如果您的系统具有32位或更小的int
,那么您可以通过移位32位或更多位置来undefined behaviour。移位的位数必须少于类型的位数。
如果你有64位int,那么0xFFFFFFFF
将是一个有符号的int,并且将它移位32位会将1
移动到符号位,这会在C和C ++中导致UB在C ++之前14。 (因为C ++ 14会导致实现定义的行为)。
printf("%x\n",mask);
也会触发UB,因为%x
需要非负值,但您传递的是负int
。为避免这种情况,请改用unsigned int mask
。
当您触发UB时,可能会发生任何事情,包括但不限于无意义输出,以及相同的操作会产生不同的结果。