你知道為什麼電腦中的資料使用補碼來表示和運算嗎?

來源:互聯網
上載者:User

總所周知,電腦內部的所有數都是以二進位的形式存在的。而二進位在電腦裡又有多種編碼方式——原碼、反碼、補碼等。而在這些編碼方式裡面用得最多的不是最簡單、最直接的原碼而是補碼。這是為什麼呢?想搞懂這個問題首先得明白什麼是原碼、反碼以及補碼,如果你對他們還不太瞭解,那就先看看我另一篇部落格——原碼、反碼、補碼其實很簡單。如果你對他們已經很熟悉,那麼我們繼續往下看。

A、B、C三種相似的東西,選C而不選A和B,那麼C肯定具有其他兩者所沒有的優勢。那麼補碼究竟有什麼優勢讓他備受青睞呢?下面我們具體的分析一下:

原碼:
原碼的特點就是編碼簡單直觀,與真值轉換非常方便。既然原碼這麼好,那為什麼不選他而選補碼呢?接下來就是不選他的關鍵所在,雖然原碼非常的簡單直觀,但是當用原碼錶示0的時候就會出問題。0用原碼錶示分為+0和-0,當機器字長為8時,

[+0]原=00000000,[-0]原=10000000。

這就有問題了,同一個數卻有兩種表示,產生了二義性,從而給機器判斷0帶來了麻煩;二是用原碼運算時,符號位需要單獨處理,而且運算規則很複雜。例如加法運算,若兩個數異號,則先要讓絕對值大的數減去絕對值小的數,然後把絕對值大的數的符號付給結果。還有就是,借位操作如果用電腦硬體實現起來是很困難的。正是因為原碼有這些不足之處,才促使人們研究其他的編碼方法。

 

反碼:

反碼很少會被用到,他主要的用途就是作為原碼與補碼的一個橋樑。他和原碼一樣對0有兩種表示方法,

[+0]反=00000000,[-0]反=11111111。

不採用反碼的原因跟原碼差不多,就不贅述了。

 

補碼:

說到補碼,就不得不引人另一個概念——模數。模數從屋裡意義上講是某種計量器的容量。這裡我們經常舉的一個例子就是鐘錶,其模數為12,即每到12就重新從0開始,數學上叫模數或求餘(mod),java、C#和C++裡用%表示求餘操作。例如:

14%12=2

如果此時的正確時間為6點,而你的手錶指向的是8點,如何把表調準呢?有兩種方法:一把表逆時針撥兩個小時;二是把表順時針撥10個小時,即

8-2=6

(8+10)%12=6

也就是說在此模數系統裡面有

8-2=8+10

這是因為2跟10對模數12互為補數。因此有一下結論:在模數系統中,A-B或A+(-B)等價於A+[B補],即

8-2/8+(-2)=8+10

我們把10叫做-2在模12下的補碼。這樣用補碼來表示負數就可以將加減法統一成加法來運算,簡化了運算的複雜程度。

採用補碼進行運算有兩個好處,一個就是剛才所說的統一加減法;二就是可以讓符號位作為數值直接參加運算,而最後仍然可以得到正確的結果符號,符號位無需再單獨處理。

 

以上就是我對原碼、反碼、補碼的一些膚淺理解,希望對大家有所協助,同時歡迎各位高手不吝賜教!感激不盡!


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.