為什麼要使用原碼 反碼 補碼

2021-05-05 01:44:58 字數 1531 閱讀 8179

前言:隨著學習計算機知識的加深,許多地方都遇到原碼、反碼、補碼。很多關於計算機的書籍都介紹原碼、反碼、補碼的表示方法,但是為什麼要用到原碼、反碼、補碼卻沒詳細說。為什麼要使用?它們的原理是什麼呢?我搜尋了許多資料,也查詢了許多書籍,終於弄明白了這個問題,收集整理如下。

我們知道數值在計算機中表示形式為機器數(機器數的概念見我的另一篇日誌《計算機中的原碼、反碼和補碼

》,計算機只能識別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等其他高階語言中使用的都是原碼。

看了上面這些大家應該對原碼、反碼、補碼有了新的認識了吧!

為什麼要使用原碼 反碼 補碼和移碼

上篇部落格簡單的介紹了計算機中原碼 反碼 補碼和移碼的表示方式 對於計算機為什麼要這樣還不是很明白,就好像知道這樣乙個東西,卻不知道為什麼要這樣。就好像乙個人你不了解他不是他的朋友,他的有些事情你就不知道他是為了什麼 其實從原碼到補碼是乙個層層遞進的關係,也是乙個在錯誤中逐步發展的過程。也就是說利用...

原碼 反碼 補碼以及為什麼要用反碼和補碼

原文遷移到 機器數乙個數在計算機中的二進位制表示形式,叫做這個數的機器數,機器數是帶符號的,在計算機中用乙個數的最高位存放符號,正數為0,負數為1,比如,十進位制中的 3,假設計算機字長為8位,轉換成二進位制就是0000 0011,如果是 3,就是1000 0011.那麼,這裡0000 0011和1...

為什麼要使用補碼

想必對於原碼,反碼,補碼大家並不陌生,計算機專業的同學都會學到這方面的一些知識。當初在學這部分的時候,只知道用補碼可以解決0和 0的問題,但是還是沒明白為什麼會想到用補碼。前陣子看了史丹福大學關於正規化程式設計的公開課,裡面老師講了這方面的內容,三言兩語給出了乙個簡單明瞭的解釋,頓時覺得好棒!思路如...