原碼反碼補碼的闡述

通用計算機概念

馮·諾依曼結構

美籍匈牙利科學家馮·諾依曼提出重要理論:

  • 存儲程序計算機結構,以二進制作爲計算機的存儲基礎
  • 計算機主要由運算器、控制器、存儲器和輸入輸出設備組成

運算器

當代計算機中只有加法運算器,沒有減法運算器。所以在計算機中,對於減法操作均是按照加法操作進行運算。

a-b = a + (-b)

機器數

機器數:一個數在計算機中的二進制表示形式, 叫做這個數的機器數。

原碼

ok,到現在我們就會發現一個問題,二進制只有0和1組成,沒有符號,那麼負數如何表示就是一個問題。爲了解決負數在二進制表示的問題就有了原碼的概念。

原碼:數字的二進制表現形式,即機器數,用最高位表示符號位,“1” 代表負數,“0”代表正數,其後的爲止

我以4位運算來舉例(主要是懶的打那麼多0)。

原碼 十進制正數字 十進制負數字 原碼
0000 0 -0 1000
0001 1 -1 1001
0010 2 -2 1010
0011 3 -3 1011
0100 4 -4 1100
0101 5 -5 1101
0110 6 -6 1110
0111 7 -7 1111

首先,我們看到了很奇怪的兩個0,一個+0一個-0,這裏是不正常的 (不要說+0和-0一樣,要記住數學上0是沒有符號的,既不是正數也不是負數)。
ok,我們開始進行計算:

2+3 = 0010+0011 = 0101 = 4 正確

那麼計算減法,我們之前說過計算機運算器是用加法表示減法,所以減法運算如下:

3-3 = 3 +(-3) = 0011+1011 = 1110=-6(這裏我是有疑問的,符號位不參與運算,不知道這裏該怎麼算)

再計算一下減法與減法相加:

(-2)+(-3) = 1010 + 1011 = 1101 = -5 似乎正確
(-4)+(-5) = 1100 + 1101 = 1001 = -1 ?鬧呢
那麼
通過上面的運算,我們可以發現,正數相加是沒問題的,負數與負數相加,正數與負數相加會產生錯誤的結果,其實這裏的計算也是不對的,因爲計算機中規定, 原碼相加符號位不參與計算
ok, 我們可以發現,用原碼進行加法計算存在問題。那麼我們就需要引入另外一個概念:反碼。

反碼

反碼:正數的反碼還是其原碼,負數的反碼是符號位不變,其餘位取反。港澳臺成爲一的補數

那麼對應反碼原碼錶格如下:

原碼/反碼 十進制正數字 十進制負數字 原碼 反碼
0000 0 -0 1000 1111
0001 1 -1 1001 1110
0010 2 -2 1010 1101
0011 3 -3 1011 1100
0100 4 -4 1100 色度
0101 5 -5 1101 1010
0110 6 -6 1110 1001
0111 7 -7 1111 1000

我們重新計算:

反碼運算符號位是參與加法運算的

4+(-4 )= 0100 + 1011 = 1111 = -0 ,似乎正確,不過如我之前所說,-0的存在就是問題。
我們再計算一個:
6 + (-4) = 0110 + 1011 = 0001= 1 錯誤

再計算負數與負數相加:

(-4)+(-5) = 1011 + 1010 = 0101 = 5 錯誤.

通過以上計算,我們可以發現,反碼似乎能夠解決除了產生-0下的正反數相加和爲0的問題,但是,對於負數與負數相加、正數與負數相加還是存在問題的。因此,我們就該討論補碼了。

補碼

補碼:是爲了在計算機運算中達到模運算的統一,從原碼衍生出來的一種碼。

補碼的求法:

正數的補碼是其本身,負數的補碼是其反碼+1.

另外一種求法:

負數的補碼等於他的原碼自低位向高位,尾數的第一個‘1’及其右邊的‘0’保持不變,左邊的各位按位取反,符號位不變。

原碼、反碼、補碼的引入本質上是爲了解決計算機中減法問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章