2016-09-20 27 views
3

在C++中,我有以下代碼:爲什麼掩蓋負數會產生一個正數?

int x = -3; 
x &= 0xffff; 
cout << x; 

這將產生

65533 

但如果我刪除負面,所以我有這樣的:

int x = 3; 
x &= 0xffff; 
cout << x; 

我只是得到3作爲結果

爲什麼第一個結果不是產生一個負數?我認爲-3會被符號擴展爲16位,因爲所有這些擴展位都是1,所以它仍然會給出一個二進制補碼負數。因此,最重要的位也是1。

回答

5

它看起來像你的系統使用32位int s與二的補碼錶示的否定。

常數0xFFFF覆蓋最不重要的兩個字節,其中高兩位字節爲零。

-3值是0xFFFFFFFD,所以用0x0000FFFF以十進制得到0x0000FFFD,或65533掩蓋它。

正面30x00000003,所以用0x0000FFFF掩蓋,給你3回來。

如果您指定了16位數據類型,您將得到預期的結果,例如,

int16_t x = -3; 
x &= 0xffff; 
cout << x; 
+0

你能否解釋爲什麼0xFFFD不再是二進制補碼形式? – Dillydill123

+0

@ Dillydill123,因爲0xffff的高2字節是0.嘗試使用32位掩碼(即0xffffffff),它應該保留符號。 – sashang

+0

有道理!謝謝 – Dillydill123

0

在你的情況int是超過2個字節。你可能運行在現代的CPU上,通常這些天的整數是4個字節(或32位)

如果你看看系統存儲負數的方式,你會看到它是一個補充數字。如果你的掩碼只有最後2個字節是0xFFFF,那麼你將只能得到它的一部分。

你2種選擇:整型

  1. 使用短intstead。通常它是一個整數的一半,將只有2叮咬
  2. 使用像0xFFFFFFFF的更大的面具,它涵蓋你的整數的所有位

注:我用「一般」,因爲位在INT量短小取決於你的CPU和編譯器。

相關問題