c 将 int 赋值给 0xFFFFFFFF,但得到 0

c assignment a int to 0xFFFFFFFF, but get 0

我想计算一个掩码来执行逻辑右移,这是我的代码:

int mask;
int arl = x >> n;
mask = ~((~0) << (32 - n));
return arl & mask; 

n等于0时,我认为mask应该是0xFFFFFFFF,但是没有用。我使用 gdb 进行调试,得到了这个:

(gdb) p/t  ~((~0) << (32 - n))
 = 11111111111111111111111111111111
(gdb) p/t  mask
 = 0

为什么掩码是0

如果 int 是 32 位长或更短,您调用了 未定义的行为

引自N1256 6.5.7 移位运算符

If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined.

试试这个:mask = n >= 32 ? ~0 : ~((~0) << (32 - n));

You are doing undefine behavior if int is 32-bit.
mask = (1 << 32); // it is undefine behaviour

then 1's complement of 0 is -1 ( ~0 ----> FFFFFFFF ).
try this:       
  int mask;
  int n = 1; // if n = 1;
  mask = ~((~0) << (32 - n)); 
  //~((-1) << (32 - 1)) ----> ~(FFFFFFFF << 31) 
  // 0111 1111 1111 1111 1111 1111 1111 1111 
  //   7    F    F    F    F    F    F    F
  printf("%x\n",mask); // output is 7FFF FFFF
  printf("%d\n"); // output is 2147483647