眾所周知,乙個正數的原碼、補碼、反碼是相同的,負數則不同。先提乙個問題,為什麼在計算機中要使用這些編碼方式呢?
1.
原碼
將最高位用做符號位(
0表示正數,
1表示負數),其餘各位代表數值本身的絕對值的表示形式。這種方式是最容易理解的。
例如,+1的原碼是
00000001,-1
的原碼是
10000001。
但是直接使用原碼在計算時卻會有麻煩,比如
(1)10
+(-1)
10=0
,如果直接使用原碼則:
(
00000001)2+
(10000001)2=
(1000010)
2
這樣計算的結果是
-2,也就是說,使用原碼直接參與計算可能會出現錯誤的結果。所以,原碼的符號位不能直接參與計算,必須和其他位分開,這樣會增加硬體的開銷和複雜性。
2.
反碼
正數的反碼與原碼相同。負數的反碼符號位為
1,其餘各位為該數絕對值的原碼按位取反。這個取反的過程使得這種編碼稱為「反碼」。
例如,-1的反碼:
11111110
同樣對上面的加法,使用反碼的結果是:
(
00000001)2+
(11111110)2=
(11111111)
2
這樣的結果是負
0,而在人們普遍的觀念中,
0是不分正負的。反碼的符號位可以直接參與計算,而且減法也可以轉換為加法計算。(注:
[+0]反=
00000000
,[-0]反=
11111111)
3.
補碼
正數的補碼與原碼相同。負數的補碼是該數的反碼加
1,這個加
1就是「補」。
例如,-1的補碼:
11111111
再次做加法是這樣的:
(
00000001)2+
(11111111)2=
(00000000)
2
直接使用補碼進行計算的結果是正確的(注:在補碼表示中,
[+0]補=
00000000
,[-0]補=
000000000
——所以
0有唯一的編碼
00000000
,不分正負
)。注意到我們這裡只是舉例,並非證明。
對乙個補碼表示的數,要計算其原碼,只要對它再次求補,可得到該數的原碼。
由於補碼能使符號位與有效值部分一起參加運算,從而簡化運算規則,同時它也使減法運算轉換為加法運算,進一步簡化計算機中運算器的電路,這使得在大部分計算機系統中,資料都使用補碼表示。
猶記得兩年前,學會了這幾種編碼的轉換,「只知其然,不知其所以然」,通過這次軟考,讓自己能夠去想這個問題。「學習是一種過程」,越來越能體會到這句話人真諦吧。弱弱地問一句,您現在知道計算機中使用這些編碼的原因了吧?(反正我知道了,嘻嘻^-^)
軟考 原碼 反碼 補碼 移碼
在計算機中,資料編碼方式可以有多種,最為常見的有原碼 反碼 補碼 移碼。在進行原碼,反碼,補碼,移碼之間的轉換的時候首先要將他們轉換為二進位制,在下面的講解中以17為例來進行講解。將17轉換為八位數的二進位制為00010001。在原碼中,將最高位用作符號位 0表示正數,1表示負數 其餘各位代表數值本...
軟考必備2 原碼 反碼 補碼和移碼
1 原碼 反碼 補碼和移碼 原碼例子如下 在原碼表示法中,最高位是符號位,0表示正號,1表示負號,其餘的n 1 位表示數值的絕對值。反碼例子如下 正數的反碼與原碼相同,負數的反碼則是其絕對值按位求反。其餘規則和原碼的一樣。補碼例子如下 正數的補碼與其原碼和反碼相同,負數的補碼則等於其反碼的末尾加1,...
軟考筆記(1) 原碼 反碼 補碼 移碼轉換
各種數值在計算機中表示的形式成為機器數,採用二進位制計數制,數的符號用0 正數 和1 負數 表示,小數點隱含表示 不佔位置 機器數分為無符號數和帶符號數,帶符號數又分為純整數和純小數。純整數 對無符號數,若約定小數點的位置在機器數的最低位之後,則為純整數,如123。純小數 對無符號數,若約定小數點的...