我想计算一个掩码来执行逻辑右移,这是我的代码:
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
?
答案 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