我正在尝试添加一个左运算符以替换以下内容:
unsigned long bitmask = 0b10000000000000000000000000000000;
printf("%lu\n", bitmask);
unsigned long bitmask2 = (1 << 31)-1;
printf("%lu\n", bitmask2);
但是,我能得到的最接近的是-1
。如果我尝试执行(1 << 31),则好像出现溢出或其他错误。正确的方法是什么?
# in the python shell
>>> 0b10000000000000000000000000000000
2147483648
>>> 1<<31
2147483648
>>> 0b10000000000000000000000000000000 == 1<<31
True
答案 0 :(得分:3)
由于移位结果的类型为unsigned long
,因此应以无符号长常量开头:
unsigned long bitmask2 = (1UL << 31) - 1;
答案 1 :(得分:1)
更改
unsigned long bitmask2 = (1 << 31)-1;
类似
unsigned long bitmask2 = (1UL << 31);
代替
溢出是由于您将1
的31个位按位移位而超出了有符号的int的边界。请注意,1
是带符号的int文字。
答案 2 :(得分:-1)
所有整数常量,例如1
都有一个类型,在这种情况下为int
。 int
是带符号的,因此具有31个数据位和1个符号位。您不能将数据移入该符号位-1<<31
是一个严重的未定义行为错误。
根据经验,切勿将带符号的操作数与按位运算符混合。您可以通过在整数常量1u << 31
上添加'u'后缀来修复该错误。现在,类型是unsigned int
,而是32个数据位。
请注意,移位操作的结果类型是 left 操作数的类型。因此,无需编写例如1u << 31u
。