看看這個編譯器:網站編譯器輸出奇怪的結果
的代碼非常簡單:
cout << ~5;
而這種輸出-6
現在我沒有C++的大師,但不知何故,我記得〜操作員應該翻轉數字位,並且由於5是101,所以我期望得到010,這是2,或者更確切地說5是0000 ...... 10 1,我應該得到1111 ... 010,這應該是一個非常大的負數,而不是6(110)。問題是:我對運營商有錯,或者我錯過了什麼?
看看這個編譯器:網站編譯器輸出奇怪的結果
的代碼非常簡單:
cout << ~5;
而這種輸出-6
現在我沒有C++的大師,但不知何故,我記得〜操作員應該翻轉數字位,並且由於5是101,所以我期望得到010,這是2,或者更確切地說5是0000 ...... 10 1,我應該得到1111 ... 010,這應該是一個非常大的負數,而不是6(110)。問題是:我對運營商有錯,或者我錯過了什麼?
負整數通常代表two's complement。 這允許基本操作(如加法和減法)以與正數一樣的方式使用負數。在這種形式,底片被表示爲:
00000000 = 0
11111111 = -1
11111110 = -2
11111101 = -3
11111100 = -4
11111011 = -5
11111010 = -6
因此,我們確實-6 =〜5
這實際上是關於補一種微妙的東西。
我會寫你的數字在基地16,在變量的大小(我假設32位,但你可以改變其他大小的答案)。
5
是0x00000005
。 ~5
是它的否定,0xFFFFFFFA
。加上5
即可,你看到~5 + 5
是0xFFFFFFFF
。再加一個,由於溢出,你得到0x00000000
或0
。
補碼錶示取得了它,以便遞增過去0x7FFFFFFF
(或2147483647
)是實際的溢出(和0x80000000
是-2147483648
),並簡單地從-1
到0
增量已經取得了不產生溢出。
您可以閱讀更多關於two's complement representation的信息,如果您願意,也可以向我索取更多信息。
你爲什麼期望「一個非常大的負數」? '-1'的二進制表示是'11 ... 1'(全1位)。另請參閱:https://en.wikipedia.org/wiki/Two%27s_complement –
您嘗試過的其他編譯器是否給出與「web編譯器」不同的結果? – juanchopanza
Windows,macOS或Linux計算器應用程序也會爲您提供相同的結果。他們會向您展示產生這些結果的二進制位模式,這應該可以幫助您查看發生了什麼。 –