簡體   English   中英

c將一個int賦給0xFFFFFFFF,但得到0

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM