總所周知,電腦內部的所有數都是以二進位的形式存在的。而二進位在電腦裡又有多種編碼方式——原碼、反碼、補碼等。而在這些編碼方式裡面用得最多的不是最簡單、最直接的原碼而是補碼。這是為什麼呢?想搞懂這個問題首先得明白什麼是原碼、反碼以及補碼,如果你對他們還不太瞭解,那就先看看我另一篇部落格——原碼、反碼、補碼其實很簡單。如果你對他們已經很熟悉,那麼我們繼續往下看。
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下的補碼。這樣用補碼來表示負數就可以將加減法統一成加法來運算,簡化了運算的複雜程度。
採用補碼進行運算有兩個好處,一個就是剛才所說的統一加減法;二就是可以讓符號位作為數值直接參加運算,而最後仍然可以得到正確的結果符號,符號位無需再單獨處理。
以上就是我對原碼、反碼、補碼的一些膚淺理解,希望對大家有所協助,同時歡迎各位高手不吝賜教!感激不盡!