2017-05-28 69 views
-3

看看這個編譯器:網站編譯器輸出奇怪的結果

https://ideone.com/Y09Z0N

的代碼非常簡單:

cout << ~5; 

而這種輸出-6

現在我沒有C++的大師,但不知何故,我記得〜操作員應該翻轉數字位,並且由於5是101,所以我期望得到010,這是2,或者更確切地說5是0000 ...... 10 1,我應該得到1111 ... 010,這應該是一個非常大的負數,而不是6(110)。問題是:我對運營商有錯,或者我錯過了什麼?

+2

你爲什麼期望「一個非常大的負數」? '-1'的二進制表示是'11 ... 1'(全1位)。另請參閱:https://en.wikipedia.org/wiki/Two%27s_complement –

+0

您嘗試過的其他編譯器是否給出與「web編譯器」不同的結果? – juanchopanza

+0

Windows,macOS或Linux計算器應用程序也會爲您提供相同的結果。他們會向您展示產生這些結果的二進制位模式,這應該可以幫助您查看發生了什麼。 –

回答

4

負整數通常代表two's complement。 這允許基本操作(如加法和減法)以與正數一樣的方式使用負數。在這種形式,底片被表示爲:

00000000 = 0 
11111111 = -1 
11111110 = -2 
11111101 = -3 
11111100 = -4 
11111011 = -5 
11111010 = -6 

因此,我們確實-6 =〜5

0

這實際上是關於補一種微妙的東西。

我會寫你的數字在基地16,在變量的大小(我假設32位,但你可以改變其他大小的答案)。

50x00000005~5是它的否定,0xFFFFFFFA。加上5即可,你看到~5 + 50xFFFFFFFF。再加一個,由於溢出,你得到0x000000000

補碼錶示取得了它,以便遞增過去0x7FFFFFFF(或2147483647)是實際的溢出(和0x80000000-2147483648),並簡單地從-10增量已經取得了不產生溢出。

您可以閱讀更多關於two's complement representation的信息,如果您願意,也可以向我索取更多信息。

+0

我沒有看到'〜'與溢出有什麼關係。這個答案是......令人困惑...... – bolov

+0

@bolov這是兩個補碼的額外部分。關於爲什麼它在硬件中使用?那麼處理器並不在乎它是否被簽名或者不是用於加法,減法和乘法(除了設置標誌,可能),因爲它的工作原理與此表示法相同。 –

+0

對不起,你的觀點並沒有通過,至少不適合我。也許如果你重新回答了答案。 – bolov