手动添加位掩码与添加位移位
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
这样的所有整数常量都有一个类型,在本例中为 int
。 int
是有符号的,因此有 31 个数据位和 1 个符号位。您不能将数据左移到此符号位 - 1<<31
是一个严重的未定义行为错误。
根据经验,切勿将带符号的操作数与按位运算符混合使用。您可以通过向整数常量添加 'u' 后缀来修复此错误:1u << 31
。现在类型是 unsigned int
,32 个数据位。
请注意,移位运算的结果类型是 left 操作数的类型。所以没有必要写例如 1u << 31u
.
我正在尝试添加一个左向运算符来替换以下内容:
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
这样的所有整数常量都有一个类型,在本例中为 int
。 int
是有符号的,因此有 31 个数据位和 1 个符号位。您不能将数据左移到此符号位 - 1<<31
是一个严重的未定义行为错误。
根据经验,切勿将带符号的操作数与按位运算符混合使用。您可以通过向整数常量添加 'u' 后缀来修复此错误:1u << 31
。现在类型是 unsigned int
,32 个数据位。
请注意,移位运算的结果类型是 left 操作数的类型。所以没有必要写例如 1u << 31u
.