在計算機中乙個數的二進位制表示形式, 叫做這個數的
機器數
。機器數是帶符號的,在計算機用乙個數的最高位存放符號, 正數為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進製 的實踐要比二或三進製計數出現的晚.摘...