原碼、反碼、補碼、移碼
原、反、補碼都是來處理負數的,正數的原、反、補碼是本身自己。
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