原碼、反碼、補碼、移碼的理解-jiku_wang

原碼、反碼、補碼、移碼

 

原、反、補碼都是來處理負數的,正數的原、反、補碼是本身自己。

 

1. 數據在計算機中的存在形式:

衆所周知數據是以100101010形式存儲在計算機中的

數據分爲有符號數和無符號數;

無符號數全部爲數值位;

有符號數的首位爲符號位,0爲正,1爲負;

爲什麼會有有符號數的存在,這是自然發展的必然,表示“欠別人的錢的數量”

但這一情況對計算機並不是很友好:

example:

設計算機字長爲4bit(只能存放4位)

+1:0001

-1:1001

1+(-1) = 1002  (-2!!!)

這就不對了,所以引出了反碼的概念

=====================================

2. 爲什麼要有反碼

首先計算機內部只實現了加法器,並沒有實現減法器

所以要想表示 X - Y

就得是這樣的形式X + (-Y)

主要的問題是如何來表示 負數!!! 

反碼就是來解決這個問題的

反碼:

正數的反碼是其本身

負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.

特點:

有反碼計算得出來的結果依然是反碼,需要再次經過取反的處理;

------------------------

先要理解模運算

 

如圖所示當數值太大超過最大位數時,會發生溢出,重新歸0;

這是一個機器字長爲4的計算機,模爲2^4 = 16;

所以其能夠表示的範圍是0~15

-----------------------------------------

一個負數可用它的正補數來代替,而這個正補數可以用模加上負數本身來得到。

一個正數和一個負數互爲補數時,兩數的絕對值之和爲模

正數的補數爲其自身。

-----------------------------------------

現在以計算 5 - 3爲例:

 # 按以上理論,減一個數等於加上它的補數,所以
 5 - 3
 # 等價於 
 5 + (16 - 3)   // 算術運算單元將減法轉化爲加法
 # 用二進制表示則爲:
 0101 + (10000 - 0011)
 # 等價於
 0101 + ((1 + 1111) - 0011)
 # 等價於
 0101 + (1 + (1111 - 0011))
 # 等價於
 0101 + (1 + 1100) // 1 + 12
 # 等價於
 0101 + 1101  //13

 # 最後一步 0101 + 1101 等於
 10010

 由於機器是4位所以要溢出1;即
 0010 = 2!!!!

瞭解模的概念之後,我們接着說反碼

---------------------------------

這樣帶來了1個問題:

(1)有了兩個0+0 0000     &  -0   1111

反碼得計算舉例:

1+(-1)[反] = 0001 + 1110 = 1111;

// 1111在反碼中是-0 

6 + (-2)[反]   =  0110   + 1101  =  0011 ;

//0010取反得0100(4), it's  cool!!!

-7[反]  + 2 = 1000 + 0010 = 1010;

1010取反得1101= 5!

 

======================================

3. 補碼的作用

爲什麼叫補碼?

關鍵在於  “補”  字,complement

因爲經過反碼得處理有兩個0,所以將反碼得到得數 + 1;即可消除一個 - 0 (1111)

 

補碼的定義:

-------------

就是在反碼的基礎上按照正常的加法運算加1。

例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]補=11010101

PS:0的補碼是唯一的,如果機器字長爲8那麼[0]補=00000000。

特點:

由補碼計算得結果同樣也是補碼

這樣就解決了+0和-0同時存在的問題

另外"正負數相加等於0"的問題,同樣得到滿足

舉例,3和(-3)相加,0011 + 1101 =10000,丟掉最高位,就是0000(0)

同樣有失必有得,我們失去了(-0) , 收穫了(-8)

以上就是"補碼"的存在方式

結論:保存正負數,不斷改進方案後,選擇了最好的"補碼"方案

這樣我們減去一個數,轉換成加上這個數的負數形式

就是要加上這個負數的補碼、取反加一。

example:

7 - 3
等價於
7 + (-3)

01111 + 1101[補]  =   10100 (進位溢出)

得到0100 (補碼)
取反加1,得到:
0011 + 1 = 0100 ——>4!

 

4. 移碼的作用

計算機中使用補碼來計算的,但是補碼對於人來講不是很友好,看不出誰大誰小

 

故使用移碼來處理,就能顯示出大小

移碼就是在真值X上加上一個常數,2^n   n爲字長減1

特點:

只需將補碼的符號位取反即可得到移碼。

=====================================

參考文章:

https://www.zhihu.com/question/20159860

https://blog.csdn.net/leonliu06/article/details/78685197

over

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章