在C++中,我有以下代碼:爲什麼掩蓋負數會產生一個正數?
int x = -3;
x &= 0xffff;
cout << x;
這將產生
65533
但如果我刪除負面,所以我有這樣的:
int x = 3;
x &= 0xffff;
cout << x;
我只是得到3
作爲結果
爲什麼第一個結果不是產生一個負數?我認爲-3會被符號擴展爲16位,因爲所有這些擴展位都是1,所以它仍然會給出一個二進制補碼負數。因此,最重要的位也是1。
在C++中,我有以下代碼:爲什麼掩蓋負數會產生一個正數?
int x = -3;
x &= 0xffff;
cout << x;
這將產生
65533
但如果我刪除負面,所以我有這樣的:
int x = 3;
x &= 0xffff;
cout << x;
我只是得到3
作爲結果
爲什麼第一個結果不是產生一個負數?我認爲-3會被符號擴展爲16位,因爲所有這些擴展位都是1,所以它仍然會給出一個二進制補碼負數。因此,最重要的位也是1。
它看起來像你的系統使用32位int
s與二的補碼錶示的否定。
常數0xFFFF
覆蓋最不重要的兩個字節,其中高兩位字節爲零。
的-3
值是0xFFFFFFFD
,所以用0x0000FFFF
以十進制得到0x0000FFFD
,或65533
掩蓋它。
正面3
是0x00000003
,所以用0x0000FFFF
掩蓋,給你3
回來。
如果您指定了16位數據類型,您將得到預期的結果,例如,
int16_t x = -3;
x &= 0xffff;
cout << x;
在你的情況int是超過2個字節。你可能運行在現代的CPU上,通常這些天的整數是4個字節(或32位)
如果你看看系統存儲負數的方式,你會看到它是一個補充數字。如果你的掩碼只有最後2個字節是0xFFFF,那麼你將只能得到它的一部分。
你2種選擇:整型
注:我用「一般」,因爲位在INT量短小取決於你的CPU和編譯器。
你能否解釋爲什麼0xFFFD不再是二進制補碼形式? – Dillydill123
@ Dillydill123,因爲0xffff的高2字節是0.嘗試使用32位掩碼(即0xffffffff),它應該保留符號。 – sashang
有道理!謝謝 – Dillydill123