簡單定義
正數或負數的真值為其絕對值對應的位元前面加上正號或負號。
比如: 2的真值為+00000010
-2的真值為-00000010
(其中正號可以省略)
- 原碼:(原碼的第一位表示符號位,0表示正,1表示負)
正數的原碼為對應的位元, 如2的原碼為00000010
負數的原碼為其絕對值對應的位元的第一位變為1,如-2的原碼為10000010
正數的反碼與其原碼相同
負數的反碼是對其原碼逐位取反,符號位除外。
正數的補碼與原碼相同
負數的補碼是在其反碼的末位加1
移碼是對補碼的符號位取反得到的
以8位位元為例:
2 -2
真值 00000010 -00000010
原碼 00000010 10000010
反碼 00000010 11111101
補碼 00000010 11111110
移碼 10000010 01111110
為什麼要使用原碼,反碼,補碼 ?
日常生活中,我們使用十進位來表示一個數, 如果是負數的話,我們就在數的前面加一個符號( “-”)。
但是在電腦中,只能識別0 和 1。(類似脈衝的變化.....).
這樣的話,就需要使用二進位的方式來表示數。
對於負號的識別方面,用一個位元的最高為存放符號(0為正, 1為負), 這樣就產生了機器數的原碼了。
在使用原碼進行計算時, 比如:
十進位 (1) 10 - (1)10 = (1)10 + (-1)10 = (0)10
二進位 (0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 )
很顯然,這個結果是錯誤的。這樣得到一個結論,涉及到負數的加法時,使用原碼進行加減是有問題的。
於是乎, 嘗試使用反碼進行運算:
(0 0000001)反 + (1 1111110)反 = (1 1111111)反 = (1 0000000)原 = ( -0 )
看上去接近了, 但還是有問題,結果應該是(+0)
(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的。於是就引入了補碼的概念
負數的補碼就是對反碼加一,而正數的補碼不變,正數的原碼反碼補碼是一樣的。在補碼中用(-128)代替了(-0),這個是人為規定的,所以補碼的表示範圍為:
(-128~0~127)共256個。
(0 0000001)補 + (1 1111111)補 = (0 0000000)補 = ( 0 )
這下正確了。
所以補碼的設計目的是:
⑴ 使符號位能與有效值部分一起參加運算,從而簡化運算規則。補碼機器數中的符號位,並不是強加上去的,是資料本身的自然組成部分,可以正常地參與運算。
⑵ 使減法運算轉換為加法運算,進一步簡化電腦中運算器的線路設計。
所有這些轉換都是在電腦的最底層進行的,而在我們使用的彙編、c等其他進階語言中使用的都是原碼。