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

时间:2016-03-03 06:12:30

标签: c bit

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

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

n等于0时,我认为掩码应为0xFFFFFFFF,但它不起作用。我使用gdb进行调试,得到了这个:

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

为什么面具是0

2 个答案:

答案 0 :(得分:3)

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

引用fron N1256 6.5.7按位移位运算符

  

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

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

答案 1 :(得分: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