前言:隨著學習計算機知識的加深,許多地方都遇到原碼、反碼、補碼。很多關於計算機的書籍都介紹原碼、反碼、補碼的表示方法,但是為什麼要用到原碼、反碼、補碼卻沒詳細說。為什麼要使用?它們的原理是什麼呢?我搜尋了許多資料,也查詢了許多書籍,終於弄明白了這個問題,收集整理如下。
我們知道數值在計算機中表示形式為機器數(機器數的概念見我的另一篇日誌《計算機中的原碼、反碼和補碼》,計算機只能識別0和1,使用的是二進位制。而在日常生活中人們使用的是十進位制,並且我們用的數值有正負之分。於是在計算機中就用乙個數的最高位存放符號(0為正,1為負)。這就是機器數的原碼了。
有了數值的表示方法就可以對數進行算術運算,但是很快就發現用帶符號位的原碼進行乘除運算時結果正確,而在加減運算的時候就出現了問題,如下:假設字長為8bits
(1) 10 - (1)10 = (1)10 + (-1)10 = (0)10
(0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 ) 顯然不正確。
因為在兩個整數的加法運算中是沒有問題的,於是就發現問題出現在帶符號位的負數身上。對除符號位外的其餘各位逐位取反就產生了反碼。反碼的取值空間和原碼相同且一一對應。下面是反碼的減法運算:
(1)10 - (1)10 = (1)10 + (-1)10 = (0)10
(0 0000001)反 + (1 1111110)反 = (1 1111111)反 = ( -0 ) 有問題。
(1)10 - (2)10 = (1)10 + (-2)10 = (-1)10
(0 0000001)反 + (1 1111101)反 = (11111110)反 = (-1) 正確。
問題出現在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的。(印度人首先將零作為標記並放入運算之中,包含有零號的印度數學和十進位制計數對人類文明的貢獻極大)。
於是就引入了補碼概念。負數的補碼就是對反碼加一,而正數的補碼不變,正數的原碼反碼補碼是一樣的。在補碼中用(-128)代替了(-0),這個是人為規定的,所以補碼的表示範圍為:
(-128~0~127)共256個。
注意:(-128)沒有相對應的原碼和反碼, (-128) = (1 0000000) 補碼的加減運算如下:
(1)10 - (1)10 = (1)10 + (-1)10 = (0)10
(0 0000001)補 + (1 1111111)補 = (0 0000000)補 = ( 0 ) 正確。
(1)10 - (2)10 = (1)10 + (-2)10 = (-1)10
(00000001)補 + (11111110)補 = (11111111)補 = (-1) 正確。
所以補碼的設計目的是:
⑴ 使符號位能與有效值部分一起參加運算,從而簡化運算規則。補碼機器數中的符號位,並不是強加上去的,是資料本身的自然組成部分,可以正常地參與運算。
⑵ 使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計。
所有這些轉換都是在計算機的最底層進行的,而在我們使用的彙編、c等其他高階語言中使用的都是原碼。
看了上面這些大家應該對原碼、反碼、補碼有了新的認識了吧!
為什麼要引入補碼
現在我們知道了計算機可以有三種編碼方式表示乙個數.對於正數因為三種編碼方式的結果都相同,所以不需要過多解釋 原碼 1 0000 0001 反碼 1 0000 0001 補碼 1 0000 0001 為了解決原碼做減法的問題,出現了反碼 1 1 1 1 0000 0001 原 1000 0001 原 ...
原碼 反碼 補碼以及為什麼要用反碼和補碼
原文遷移到 機器數乙個數在計算機中的二進位制表示形式,叫做這個數的機器數,機器數是帶符號的,在計算機中用乙個數的最高位存放符號,正數為0,負數為1,比如,十進位制中的 3,假設計算機字長為8位,轉換成二進位制就是0000 0011,如果是 3,就是1000 0011.那麼,這裡0000 0011和1...
為什麼要使用原碼 反碼 補碼
前言 隨著學習計算機知識的加深,許多地方都遇到原碼 反碼 補碼。很多關於計算機的書籍都介紹原碼 反碼 補碼的表示方法,但是為什麼要用到原碼 反碼 補碼卻沒詳細說。為什麼要使用?它們的原理是什麼呢?我搜尋了許多資料,也查詢了許多書籍,終於弄明白了這個問題,收集整理如下。我們知道數值在計算機中表示形式為...