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