原碼 反碼 補碼

2021-06-26 11:36:42 字數 2537 閱讀 3858

在計算機中乙個數的二進位制表示形式,  叫做這個數的

機器數

。機器數是帶符號的,在計算機用乙個數的最高位存放符號, 正數為0, 負數為1。比如,十進位制中的數 +1 ,計算機字長為8位,轉換成二進位制就是0000 0001。如果是 -1,就是 1000 0001 。那麼,這裡的

0000 0001

和1000 0001

就是機器數。

因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數

1000 0001

,其最高位1代表負,其真正數值是 -1,而不是形式值129(

1000 0001

轉換成十進位制等於129)。所以,為區別起見,將帶符號位的機器數對應的真正數值稱為機器數的

真值

原碼就是符號位加上真值的絕對值,即用第一位表示符號, 其餘位表示值。 例如使用8位二進位制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

8位二進位制數的取值範圍就是:

[1111 1111,0111 1111]

即:[-127 ,127]

(十進位制)

反碼區分正數和負數。正數的反碼與原碼保持一致;負數的反碼是符號位不變,其它位分別取反。

[+1]

原=  [+1]

反 = 0000 0001

[-1]

原= 1000 0001

[-1]

反= 1111 1110

補碼同反碼一樣也區分正數和負數。正數的補碼與原碼保持一致;負數的補碼是符號位不變,其它位分別取反,最後加1,即在負數反碼的基礎上加1。

[+1]

原=  [+1]補 = 0000 0001

[-1]

原= 1000 0001

[-1]

補=1111 1111

從(二)中知道,乙個數字可以有三種

二進位制表示形式,並且正數的原碼、反碼和補碼

相同;負數的反碼在原碼的基礎上,符號位不變,其它位取反,補碼在反碼的基礎上加1.

[+1] = [+1]

原=  [+1]反 = [+1]

補=0000 0001

[-1] = [1000 0001]

原=  [1111 1110]反 = [1111 1111]補

可見負數的原碼、 反碼和補碼是

完全不同

的。既然原碼才是被人腦直接識別並用於計算表示方式,為何還會有反碼和補碼呢?

人腦可以知道資料的正負, 在計算的時候根據符號, 對資料進行加減。是對於計算機,辨別「符號位」顯然會讓基礎電路設計變得十分複雜,於是將符號位也參與運算。根據運算法則減去乙個正數等於加上乙個負數, 即:

1-1 = 1 + (-1) = 0

, 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了。

於是人們開始探索將符號位參與運算, 並且只保留加法的方法。首先來看原碼:

十進位制的表示式:

1-1=0

原碼二進位制的表示式:

1 - 1 = 1 + (-1) = [0000 0001]

原+ [1000 0001]

原= [1000 0010]

原= -2

通過例子表明,將符號位參與運算,使用原碼進行

減法運算, 結果顯然不正確。這也就是為何計算機內部不使用原碼表示乙個數字原因。為了解決原碼做減法的問題,出現了反碼:

反碼二進位制的表示式:

1 - 1 = 1 + (-1) = [0000 0001]

反 + [1111 1110]

反 = [1111 1111]反

=[1000 0000]

原= -0

發現用反碼計算減法,結果的真值部分是正確的。 而唯一的問題其實就出現在"0"這個特殊的數值上。雖然人們理解上+0和-0是一樣的,但是0帶符號是沒有任何意義的。而且會有[0000 0000]

原和[1000 0000]

原兩個編碼表示0。於是補碼的出現,解決了0的符號以及兩個編碼的問題:

補碼二進位制的表示式:

1 - 1 = 1 + (-1) = [0000 0001]

補 + [1111 1111]補 = [0000 0000]補 =[0000 0000]原 =  0

這樣0用[0000 0000]表示, 而以前出現問題的-0則不存在了,而且可以用

[1000 0000]

表示-128:

補碼二進位制的表示式:

(-1) + (-127) = [1000 0001]

原 + [1111 1111]原 = [1111 1111]補 + [1000 0001]補 = [1000 0000]補

於是預定

[1000 0001]

補表示-128, [0000 0000]

補表示0,但是注意因為實際上是使用以前的-0的補碼來表示-128,所以-128並沒有原碼和反碼表示。這就是為什麼8位二進位制,使用原碼或反碼表示的範圍為[-127 +127],而使用補碼表示的範圍為[-128 127]。

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...

原碼 反碼 補碼

數值在計算機中表示形式為機器數 計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的 是十進位制,正如亞里斯多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手 指頭這個解剖學事實的結果.儘管在歷史上手指計數 5,10進製 的實踐要比二或三進製計數出現的晚.摘...