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