在計算機中,負數都是以補碼的形式存放的。而負數的補碼正是正數的補碼的相反數,由于我們隻知道如何計算正數的二進制,所以在求負數的二進制的時候,應該先求負數的相反數的二進制(即正數的二進制),然後再求正數的二進制的相反數。具體計算過程如下:先求負數所對應的相反數(即正數)的二進制,然後再取反,再加1,就得到了負數的二進制,這也是負數在計算機中的存儲形式。
如果反過來,則應該逆着算,具體步驟如下:現已知某負數的二進制,求該負數的十進制,則應該先将負數的二進制取反再加1,得到對應正數的二進制,然後再求該正數的十進制,最後取相反數,就得到了該負數的十進制。圖示如下:
從上面的圖可以看出,負數要求二進制,必須通過正數;反過來求,也必須通過正數。
注意:這裡講的二進制,都是指整數的補碼。當我們看到一個補碼時,如何判斷它是正數還是負數呢,關鍵是看它的符号位(最高位),若為1則為負數,轉換成十進制後還需取它相反數,若為0則為正數。
在以前的書籍中,反碼和補碼是這樣說的:
求反碼:對于正數,其反碼和原碼相同;對于負數,則将其原碼的符号位保持不變,而将其他位按位取反(即将0換為1,将1換為0)。
求補碼:對于正數,其補碼和原碼相同;對于負數,先求其反碼,再在最低位加1(稱為末位加1)。若對一補碼再次求補,就又得到了對應的原碼。
注意:“對應的原碼”指的是正數的二進制或負數的二進制,若已經得到負數的補碼,然後對其再一次求補,則會得到負數的原碼,即負數的二進制。
負數的二進制,其實就是,在正數的二進制的最高位前面加一個符号位1。
但這種方法在使用時需要注意,在求負數的補碼時,先要将負數轉換成二進制,然後以該二進制為原碼來去求補碼。而在将負數轉換成二進制的時候,其最高位(即符号位)一定是1,并且轉換時不需要考慮數據的字節長度(即,需要多少位來表示這個數,那就用多少位);還有,将負數的二進制轉換回負數時,其符号位是不算在内的,符号位隻表示正負,不表示數值的大小。例如,求-128的補碼:
-128的二進制是110000000(注意:-128占了9位,超出了一個字節),然後按照上面的規則求其補碼,先求反碼(符号位保持不變,其他位取反),再加1,結果為110000000,發現與原來一樣,若用一個字節來存儲,那就是10000000(把高位給截掉),也就是說,-128在計算機存儲時是以10000000(補碼)的形式存儲的,在計算機中它就表示-128。
其實,以上兩種計算負數補碼的方法,本質上是一樣的,因為在“取反加1”這一步中,兩種方法都隻是把負數的絕對值(即正數)取反加1,而并沒有把符号位也取反;但這兩種方法還是有所區别的,前一種方法在計算過程中直接把符号位給舍棄掉了,直接用正數取反加1後的結果的最高位來替代符号位;而後一種方法則并沒有舍棄,所以在計算過程中需要加入符号位,但它隻用來表示所存儲的數是一個正數還是一個負數,在實際計算過程中它并不參與,在存儲時符号位是會被舍棄的,不算在内,不管符号位是否超出了存儲範圍。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!