弄懂任何問題均需搞清楚來龍去脈,這樣大腦才更清晰,問題理解得更透徹!
1.計算機中處理的數據分爲數值型數據和非數值型數據兩大類
數值型數據是指能進行算術運算(加、減、乘、除四則運算)的數據,即通常所說的具有大小的“數”;非數值型數據是指文字、圖像等不能進行算術運算的數據。這裏我們重點討論數值型數據(簡稱爲數值)。數值在計算機內的表示,設計到數值的大小、符號、以及小數點的表示等問題。二進制數只有0和1兩個基本符號,需要用這兩個符號的不同組合來表示不同的數。
2.無符號數和有符號數(我們這裏只討論有符號數)
有符號數的"+"、"-"號機器無法識別,但是“正”、“負”恰好是兩種截然不同的狀態,如果用“0”表示“正”,用“1”表示“負”,這樣符號也被數字化了。如
十進制 | 二進制真值 | 機器數 |
---|---|---|
+94 | +1011110 | 01011110 |
-49 | -0110001 | 10110001 |
把符號“數字化”的數稱爲機器數,而把帶“+”或“-”符號的數稱爲真值。
接下來又有些問題需要考慮,在運算過程中,符號位能否和數值部分一起參加運算?如果參加運算,符號位又需作哪些處理?這些問題鬥魚符號位和數值位所構成的編碼有關,這些編碼就是原碼、補碼、反碼和移碼。
3.原碼
原碼錶示簡單明瞭,並易於和真值轉換。但用原碼進行加減運算時,卻帶來了許多麻煩。例如,當兩個操作數符號不同且要作加法運算時,先要判斷兩數絕對值大小,然後將絕對值大的數減去絕對值小的數,結果的符號以絕對值大的數爲準。運算步驟既複雜又費時,而且本來是加法運算卻要用減法器實現。那麼能否在計算機中只設加法器,只作加法操作呢?如果能找到一個與負數等價的正數來代替該負數,就可把減法操作用加法代替。而機器數採用補碼時,就能滿足此要求。
4.補碼
計算機辨別”符號位”顯然會讓計算機的基礎電路設計變得十分複雜! 於是人們想出了將符號位也參與運算的方法,即採用補碼。將補數的概念用到計算機中,便出現了補碼這種機器數。引入補碼的概念是爲了消除減法運算,但是形成補碼的過程中又出現了減法。如
x=-1011
[x]補= 2^(4+1)+ x = 100000 - 1011=1,0101
但是“由原碼除符號位外,每位求反,末位加1,求補碼”就可避免減法運算啦。
補碼的出現還避免了原碼中有“+0”、“-0”,雖然人們理解上+0和-0是一樣的, 但是0帶符號是沒有任何意義的。而且會有[0000 0000]原和[1000 0000]原兩個編碼表示0。-0的補碼與+0相同均爲[0000 0000]補 所以補碼能比原碼和反碼多表示一個負數即-128, 而-128並沒有原碼和反碼錶示。
5.反碼
反碼通常用來作爲原碼求補碼或者補碼求原碼的中間過渡。
6.移碼
7.補碼爲什麼會比原碼和反碼多表示一個數?
首先看一個實例:
設機器數字長爲8位(其中1位爲符號位),對於整數,當其分別代表原碼、補碼和反碼時,對應的真值範圍各爲多少?
二進制代碼 | 原碼對應的真值 | 補碼對應的真值 | 反碼對應的真值 | - |
---|---|---|---|---|
00000000 |
|
|
|
- |
00000001 |
|
|
|
- |
00000010 |
|
|
|
- |
|
|
|
|
- |
01111110 |
|
|
|
- |
01111111 |
|
|
|
- |
10000000 |
|
|
|
- |
10000001 |
|
|
|
- |
10000010 |
|
|
|
- |
|
|
|
|
- |
11111101 |
|
|
|
- |
11111110 |
|
|
|
- |
11111111 |
|
|
|
- |