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

c将int赋值给0xFFFFFF,但得到0,c,bit,C,Bit,我想计算一个掩码来执行逻辑右移,这是我的代码: int mask; int arl = x >> n; mask = ~((~0) << (32 - n)); return arl & mask; 为什么掩码是0?如果int的长度为32位或更短,则调用了未定义的行为 引用6.5.7位移位运算符 如果右操作数的值为负或为 大于或等于提升的左操作数的宽度,行为未定义 试试这个:mask=n>=32~0:~(~0)如果int的长度为32位或更短,则调用了未定义的行为

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

int mask;
int arl = x >> n;
mask = ~((~0) << (32 - n));
return arl & mask; 
为什么掩码是
0

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

引用6.5.7位移位运算符

如果右操作数的值为负或为 大于或等于提升的左操作数的宽度,行为未定义

试试这个:
mask=n>=32~0:~(~0)如果
int
的长度为32位或更短,则调用了未定义的行为

引用6.5.7位移位运算符

如果右操作数的值为负或为 大于或等于提升的左操作数的宽度,行为未定义

试试这个:
mask=n>=32?~0:~(0)
如果int是32位的,那么您正在执行取消定义行为。
mask=(1
如果int为32位,则您正在执行取消定义行为。

mask=(1谢谢,当n为0时,我认为这是一种特殊情况,我设置mask=-1使其工作。谢谢,当n为0时,我认为这是一种特殊情况,我设置mask=-1使其工作。使用无符号类型进行位操作…使用无符号类型进行位操作。。。
(gdb) p/t  ~((~0) << (32 - n))
$2 = 11111111111111111111111111111111
(gdb) p/t  mask
$3 = 0
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