我對補碼的理解

2021-05-23 07:07:58 字數 1665 閱讀 9877

計算機中用補碼表示乙個數是為了方便運算的,這樣減法也可以通過加法來實現。為什麼這樣設計行呢?主要是因為計算機里數的特殊儲存格式決定的,計算機裡用固定位數表示乙個數,超過該位置的部分會被捨棄。

拿8byte的int型來說,無符號形式下,最大到1111 1111 = 255,超過了該範圍,會被截斷的,如:111 1111 1111 –> 1111 1111 = 255,故表示範圍是0~255。這樣的話,減去乙個數可以通過加上某個數撐出界後截斷來處理。無符號形式下,拿兩個正數來舉例,並且是大數減小數,如38 – 37。

數學中是這樣描述的:減去乙個數等於加上該數的相反數,即38 +(-37)。那-37怎麼表示呢?考慮37 +(-37) = 0, 37 = 0010 0101,加上-37能撐到1 0000 0000就行了。

現在引進反碼的概念,即按位求反,37的反碼是1101 1010,與原碼相加,變成1111 1111。再加上1的話就正好撐出界 ,是1 0000 0000,截位後為0。故-37 =  1101 1010 + 1 = 1101 1011。38 =0010 0110 ,加上1101 1011後為1 0000 0001 = 1,借助截位達到減的效果。

當然無符號情況下不能表示負數的。上述-37 = 1101 1011,其實是219。故將最高位設為符號位,1表示負數,0表示正數。

這樣8byte的int型表示的最大正數是0111 1111 = 127,那負數是怎麼表示的?才能滿足減法也能通過加法來實現。是不是1000 0001 就是- 1!這樣不合適,拿2 – 1 = 2 + (-1)來說,0000 0010 + 1000 0001 = 1000 0011 ,  如果是那樣表示的話,應該是-3。

其實將無符號情況拿過來直接用就行了,-37 = 1101 1011。這樣運算就方便了,直接加就行了。那為什麼拿過來,負數的最高位正好是1呢?其實看看正數的表示範圍就可理解了,有符號正數只能表示0000 0001 ~0111 1111,若想通過撐到1 0000 0000截斷的方式求相反數(負數),最高位必須是1。都是0000 0001 ~0111 1111範圍的兩個數怎麼加都在1111 1110以下。且對於0000 0001 ~0111 1111範圍的任何數,都存在最高位是1的8位數(二進位制)和它相加撐到1 0000 0000。0就不用求相反數,和本身一樣,故放在正數里。

當然這只是運算上方便,並不是幹什麼都方便,顯示出來時就得轉換了。那補碼情況下數是怎麼顯示的呢?首先判斷符號位,符號位為0就是正數,如0111 1111,那就是127,和原碼一樣。符號位為1是負數,須轉換,如1111 1111,那考慮它是怎麼來的,是通過絕對值的原碼求反加1,那反過來就是減一求反,1111 1111 -> 1111 1110 -> 0000 0001 = 1, 故1111 1111 的值是-1。

考慮求反加一和減一求反是一樣的,其實補碼就是這樣乙個數:與原碼相加後正好撐出界,截斷後為0,即相加為1 0000 0000 = 0,用公式表示就很容易理解了。a是原碼,b是a的反碼,c = b + 1是a的補碼,a + b + 1 = 1 0000 0000,即a + c = 1 0000 0000,  從無符號的角度考慮,a和c互為補碼,知道c求a可不原路返回,將c看成原碼,求反加一得a。

再說說有符號數的表示範圍吧!非負數只能表示0~127,即0000 0000 ~0111 1111,那負數的範圍呢?負數是1000 0000 ~1111 1111,即-128~-1。故整個表示範圍是-128~127。

總的來說,補碼是為了運算方便,顯示時須轉換。

我對補碼的一點理解

剛剛學習c語言,接觸補碼時,有些不解,計算機為什麼要把減法變成加法來運算呢 一步到位,處理速度不更快麼?後來查了資料才知道,這與計算機本身的計算結構有關,減法變加法,物理方面更容易實現。但補碼是怎樣把減法便加法的呢?本人思考了一下,有如下心得 我們先來看一道題 59 18 47 就是 0011 10...

對 128的補碼的理解。

今天看到乙個問 128的補碼為何就是 1000 0000的貼子.問是如何計算出來?是不是還是按 取相應正數的原碼,最高位即符號位,取1,其餘各位取反後 整個得值 1?按我的理解 上學時學c語言就是這樣理解的,老譚那本書上講整數的取值範圍那段就有 16位int 32768至32767 2 16 1 至...

對 128的補碼的理解

今天看到乙個問 128的補碼為何就是 1000 0000的貼子.問是如何計算出來?是不是還是按 取相應正數的原碼,最高位即符號位,取1,其餘各位取反後 整個得值 1?按我的理解 上學時學c語言就是這樣理解的,老譚那本書上講整數的取值範圍那段就有 16位int 32768至32767 2 16 1 至...