通用計算機概念
馮·諾依曼結構
美籍匈牙利科學家馮·諾依曼提出重要理論:
- 存儲程序計算機結構,以二進制作爲計算機的存儲基礎
- 計算機主要由運算器、控制器、存儲器和輸入輸出設備組成
運算器
當代計算機中只有加法運算器,沒有減法運算器。所以在計算機中,對於減法操作均是按照加法操作進行運算。
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’保持不變,左邊的各位按位取反,符號位不變。
原碼、反碼、補碼的引入本質上是爲了解決計算機中減法問題