1. 程式人生 > >**關於原碼補碼的一點想法**

**關於原碼補碼的一點想法**

一些總結
從一開始接觸原碼補碼老師強調的概念都是:正數最高位為0,正數的反碼補碼都是它本身;負數最高位為1,補碼為它的反碼加1,符號位保持不變。根據這個概念我總是不能理解為什麼-128的補碼為10000000。
到後面看了很多優秀文章之後才明白。眾所周知,在計算機中,都是以補碼的形式進行運算。這裡我將以時鐘舉例,一個時鐘分為12個單位,時鐘的表示範圍則為12,我們將此稱為模,-3點(即逆時針旋轉3個單位)和+9點(順時針旋轉9個單位)表示的是同一個點。為了好理解我們把補定義為順時針旋轉多少單位能到的位置。所以+3的補為+3,而-3的補為+9,所以(-3)=12-|-3|=+9。我們以八進位制為例,它的表示範圍即為2^8=256,即模為256。那麼(-128)補 =256-|-128|=128=10000000.即一個負數的補碼=模-|負數|,這是單純的根據模來理解。

囉嗦嗦-----------
當我翻起一本微機教材的時候,看見解釋如下:計算機中的數用二進位制表示,分為有符號數和無符號數。對於有符號數而言,最高有效位為符號位,其餘為數值位。對於負數的補碼是對該負數相對應的正數的補碼按位求反末位加1。例:
【+1】補=00000001
按位求反 11111110
末位加1 11111111
即【-1】補=11111111
補碼是存在符號擴充套件和表數範圍問題的,符號擴充套件原則為正數前添0,負數前添1,,表數範圍即為n位補碼能表示的範圍,一般來說,n位補碼錶數範圍為-2^(n-1) 到2^(n-1)-1 。下面想稍稍談下計算機怎麼用補碼進行運算的,舉個例子。
例:
-23+(-15)=(-38)
11101001【-23】補
+ 11110001【-15】補
——————————————
1 11011010【-38】補
由此可見,在計算過程中可能出現最高有效位像高位的進位由於機器字長的限制而自動丟失的情況,但是並不影響計算的正確性,是因為機器把這一丟失的進位保留在了微處理器標誌暫存器的進位位中。想來,這就是計算機中用補碼進行運算的好處之一吧。第一次寫,也不知道邏輯嚴密不,緊髒兮兮的,其實發現把這個想象成一個圓就會好理解很多,順便也理解了補碼的運算。