Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在左位移位的不同实现中会有这种不同的行为?_C_Bit Shift - Fatal编程技术网

C 为什么在左位移位的不同实现中会有这种不同的行为?

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(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
的符号位时调用未定义的行为


您尝试执行的移位的结果是未定义的行为。此外,您为什么要执行
(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