左移时出现变量错误

Shift left with variable error

本文关键字:变量 错误 左移      更新时间:2023-10-16

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

#include <stdio.h>
int main(){
        int shift = 32 ;
        printf("%dn",shift);   //32
        int mask = 0xFFFFFFFF << shift;
        printf("%xn",mask);     //ffffffff      
        mask = 0xFFFFFFFF << 32;
        printf("%xn",mask); //00000000
        return 0;
}

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

如果您的系统有32位或更小的int,那么通过移动32位或更多会导致未定义的行为。移位的位数必须小于类型的位数

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

如果移位在64位的情况下按计划进行,

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

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