C 为什么在左位移位的不同实现中会有这种不同的行为?
我的代码的目的是在int(32位)表示的右边创建一个由n个零组成的掩码。我的方法是首先将负的一个存储在一个变量中,然后将其向左移动n个空间,使其向右移动n个零。代码如下:C 为什么在左位移位的不同实现中会有这种不同的行为?,c,bit-shift,C,Bit Shift,我的代码的目的是在int(32位)表示的右边创建一个由n个零组成的掩码。我的方法是首先将负的一个存储在一个变量中,然后将其向左移动n个空间,使其向右移动n个零。代码如下: int mask(int n){ int neg1=(1<<31)>>31; int mask=neg1<<n; return mask; } int掩码(int n){ int neg1=(131; int mask=neg1OP的代码在尝试左移到32位int的符号位时调用未
int mask(int n){
int neg1=(1<<31)>>31;
int mask=neg1<<n;
return mask;
}
int掩码(int n){
int neg1=(131;
int mask=neg1OP的代码在尝试左移到32位int
的符号位时调用未定义的行为
您尝试执行的移位的结果是未定义的行为。此外,您为什么要执行(131
(也是未定义的行为)以获得-1
?注意:向左移位到符号位是UB。并且“实现定义的行为的一个示例是,当有符号整数向右移位时,高阶位的传播。”因此int-neg1=(131;
可能无法按预期执行。代码必须使用int
?不带符号的问题会少很多。如果(n>=32)mask=0,您应该能够添加;否则…
语句来处理该情况。因此mask(0)-->0xFFFFFFFF
,mask(1)-->0xFFFFFFFE
mask(31)-->0x8000000
和掩码(32)-->0
?代码是否需要处理n
的其他值?非常感谢!…我只是不知道这是一种未定义的行为。尽管使用常量时得到的是我想要的值,而使用变量时得到的是另一个值,这很奇怪。@Aldo Pareja不清楚这句话“使用常量进行操作时,我得到了我想要的结果,而使用变量进行操作时。”详细信息1
mask=0xffffffff<<n;
#include <stdio.h>
#include <inttypes.h>
uint32_t mask32(int n) {
return 0 - (1ull << n);
}
int main(void) {
for (int i=0; i<=32; i++) {
printf("%2d %lX\n", i, (unsigned long) mask32(i));
}
}
0 FFFFFFFF
1 FFFFFFFE
2 FFFFFFFC
...
29 E0000000
30 C0000000
31 80000000
32 0