1. 程式人生 > 其它 >二進位制中補碼的理解

二進位制中補碼的理解

  先從熟悉的十進位制說起:1,2,3,4,5,6,7,8,9代表正數(前面+號可以省略),-1,-2,-3,-4,-5,-6,-7,-8,-9代表複數,0唯一。其中,前面的+號和-號代表的實際上是人為規定分別代表正數和負數,後面的數進行數值運算。兩個正數相加仍是正數,兩個負數相加仍是負數,一個正數一個負數相加,則比較絕對值大小,前面符號位為絕對值更大的那個。

  再說二進位制中,為了區分正數和負數,編碼時第一位作為符號位,0代表正數,1代表負數。

  按最初的想法,舉個例子,比如+4,+5用二進位制表示:

  0 0100  0 0101

  -4,-5用二進位制表示:

  1 0100  1 0101

  但此時發現一個問題,4+(-4),5+(-5)應該都是0,但兩者的相加結果卻是不一樣的,實際上,在這種規則下,0也是不唯一的:會有+0,-0出現,這顯然是不合理的,這本質上是因為前面的符號位實際上是碼制,但卻參與了數值運算,兩種不同規則的運算摻雜所導致的,為了解決這個問題,就必須讓符號位也同時作為一個權值,參與到數值運算中來。1仍代表負數,0代表正數。符號位的權重為-2^(N-1),這樣才能實現負數,其餘為為正的權值,其餘位依次為:2^(N-2),...,2^1,2^0。

  以4位二進位制補碼為例,負數為1000~1111,代表-8到-1,0000代表0,0001~0111代表1到7,一共16位。此時,我們取+5,-5相加,結果為0101+1011=0,此時的0是唯一的。這樣,最高位仍能代表符號位,同時也可以參與數值運算。

  此外,正數的補碼與原碼相同,+5:0 0101  -5:1 1011 ,負數的補碼為數值位每位取反,然後+1即可。