背景問題:你知道計算機(jī)中以什么形式存儲整數(shù)嗎?是符號位加值位嗎?值位是按照正常的二進(jìn)制方式存儲的嗎?假如用3位二進(jìn)制進(jìn)行存儲,符號位0正1負(fù),1是存成001,-1是存成101嗎?
答:使用補(bǔ)碼的方式而不是正常的方式存儲,雖然是符號位加值位,但符號位承載的信息和值位的值不是你想象中的方式,比如用3位二進(jìn)制進(jìn)行存儲,符號位0正1負(fù),1會存成001,-1會存成111
首先來回憶一下剛學(xué)計算機(jī)時候的教材里是怎么解釋補(bǔ)碼的:
- 原碼表示法是機(jī)器數(shù)的一種簡單的表示法。其符號位用0表示正號,用1表示負(fù)號,數(shù)值一般用二進(jìn)制形式表示。
- 機(jī)器數(shù)的反碼可由原碼得到。如果機(jī)器數(shù)是正數(shù),則該機(jī)器數(shù)的反碼與原碼一樣;如果機(jī)器數(shù)是負(fù)數(shù),則該機(jī)器數(shù)的反碼是對它的原碼(符號位除外)各位取反而得到的。
- 機(jī)器數(shù)的補(bǔ)碼可由原碼得到。如果機(jī)器數(shù)是正數(shù),則該機(jī)器數(shù)的補(bǔ)碼與原碼一樣;如果機(jī)器數(shù)是負(fù)數(shù),則該機(jī)器數(shù)的補(bǔ)碼是它的反碼在未位加1而得到的。
- 現(xiàn)代計算機(jī)中普遍使用補(bǔ)碼表示法,而不是原碼。
WTF!WHY?!
OK,下面我們來一一解答
一、計算機(jī)為什么使用補(bǔ)碼的形式存儲整數(shù)
出于簡化計算機(jī)基本電路的考慮,讓加減法都只需要用加法電路實現(xiàn)。所以需要把減去一個正數(shù)或加上一個負(fù)數(shù)都用加上一個正數(shù)的方式來表示,于是在存儲的時候,負(fù)數(shù)被直接存儲成一種可以直接當(dāng)成正數(shù)來相加的形式 (正數(shù)不變,所以以后的討論中有時候略去正數(shù)),這種形式就是補(bǔ)碼