左移变量错误
Shift left with variable error
我正在尝试创建一个掩码,但是当我计算 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;
}
有人知道为什么会这样吗?
如果您的系统有 32 位或更小的 int
,那么您可以通过移动 32 位或更多位来导致 undefined behaviour。移位的位数必须少于类型的位数。
如果你有 64 位 int 那么 0xFFFFFFFF
将是一个带符号的 int,将它移动 32 位会将 1
移动到符号位,这会导致 C 中的 UB,并且在 C++14 之前的 C++ 中。 (自 C++14 起,这会导致实现定义的行为)。
printf("%x\n",mask);
如果在 64 位情况下按计划进行移位,也会触发 UB,因为 %x
需要非负值,但你会传递一个负值 int
.为避免这种情况,请改用 unsigned int mask
。
当你触发了UB,什么都可能发生,包括但不限于无意义的输出,同样的操作给出不同的结果。
我正在尝试创建一个掩码,但是当我计算 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;
}
有人知道为什么会这样吗?
如果您的系统有 32 位或更小的 int
,那么您可以通过移动 32 位或更多位来导致 undefined behaviour。移位的位数必须少于类型的位数。
如果你有 64 位 int 那么 0xFFFFFFFF
将是一个带符号的 int,将它移动 32 位会将 1
移动到符号位,这会导致 C 中的 UB,并且在 C++14 之前的 C++ 中。 (自 C++14 起,这会导致实现定义的行为)。
printf("%x\n",mask);
如果在 64 位情况下按计划进行移位,也会触发 UB,因为 %x
需要非负值,但你会传递一个负值 int
.为避免这种情况,请改用 unsigned int mask
。
当你触发了UB,什么都可能发生,包括但不限于无意义的输出,同样的操作给出不同的结果。