整數類型的儲存spa
前面 所說的位運算都沒有涉及負數,都假設這些運算是在unsingned/word類型(只能表示正數的整型)上進行操做。設計
但計算機如何處理有正負符號的整型呢?這個設計到補碼,反碼知識點,請看下面硬件
假設有一 int 類型的數,值爲5,那麼,咱們知道它在計算機中表示爲:00000000 00000000 00000000 00000101
5轉換成二進制是101,不過int類型的數佔用4字節(32位),因此前面填了一堆0。
如今想知道,-5在計算機中如何表示?
在計算機中,負數以其正值的補碼形式表達。數據類型
什麼叫補碼呢?這得從原碼,反碼提及。二進制
反碼,補碼數據
所謂原碼就是前面所介紹的二進制定點表示法,即最高位爲符號位,「0」表示正,「1」表示負,其他位表示數值的大小。margin
反碼錶示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。top
補碼錶示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。word
有原碼就能夠了,爲何還須要反碼和補碼?計算機
反碼是用來算補碼的,原碼和補碼都是用在CPU的基本運算裏的,好比數據類型是short:
計算5 - 2,並因爲實際上CPU沒有實現減法電路(注:計算機的硬件結構中只有加法器,因此大部分的運算都必須最終轉換爲加法,原碼沒有辦法作減法,而在咱們使用的彙編、C等其餘高級語言中使用的都是原碼,原碼轉換成補碼都是在計算機的最底層進行的)。原碼計算是 5+(-2)
0101
+1010
-------
1111
=-7?顯然出錯
因此無論正數仍是負數,都使用補碼來表示(正數原碼和補碼是同樣的), 2的補碼是1110,而後用5補 + 2補
0101
+ 1110
------
0011
=3,正確