手动添加位掩码与添加位移位

Manually adding a bitmask vs adding a bitwise shift

我正在尝试添加一个左向运算符来替换以下内容:

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

因为你的移位结果类型是unsigned long,你应该从一个无符号长常量开始:

unsigned long bitmask2 = (1UL << 31) - 1;

改变

unsigned long bitmask2 = (1 << 31)-1;

类似于

unsigned long bitmask2 = (1UL << 31);

改为

溢出是由于您对 1 按位移动了 31 位,这超出了有符号整数的边界。请注意 1 是一个带符号的整型文字。

1 这样的所有整数常量都有一个类型,在本例中为 intint 是有符号的,因此有 31 个数据位和 1 个符号位。您不能将数据左移到此符号位 - 1<<31 是一个严重的未定义行为错误。

根据经验,切勿将带符号的操作数与按位运算符混合使用。您可以通过向整数常量添加 'u' 后缀来修复此错误:1u << 31。现在类型是 unsigned int,32 个数据位。

请注意,移位运算的结果类型是 left 操作数的类型。所以没有必要写例如 1u << 31u.