[英]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))
$2 = 11111111111111111111111111111111
(gdb) p/t mask
$3 = 0
為什么掩碼為0
?
如果int
為32位長或更短,則調用了未定義的行為 。
引用fron N1256 6.5.7按位移位運算符
如果右操作數的值為負或大於或等於提升的左操作數的寬度,則行為是不確定的。
試試這個: mask = n >= 32 ? ~0 : ~((~0) << (32 - n));
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.