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