原码补码与反码
【README】
1.本文內(nèi)容總結(jié)自“哈工大劉宏偉”老師的mooc視頻《計(jì)算機(jī)組成原理》on bilibili;
2.為了便于理解,本文引入了逗號(hào)分割符號(hào)部分和數(shù)值部分,計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的時(shí)候沒有逗號(hào);
【1】原碼表示法
原碼定義: 原碼是真值保存在計(jì)算機(jī)當(dāng)中的數(shù)據(jù)格式,包括寄存器,內(nèi)存等;其數(shù)值位數(shù)是有限的(超出的部分會(huì)被丟棄)
例子:
【2】補(bǔ)碼表示法
補(bǔ)碼定義: 為了把加法和減法合并為加法(歸一化),即為了簡(jiǎn)化算術(shù)邏輯單元(ALU)的設(shè)計(jì),引入補(bǔ)碼讓計(jì)算機(jī)只做加法(把減法轉(zhuǎn)換為加法);
例: x - y = x + (y)的補(bǔ)碼; 這樣就可以把減法轉(zhuǎn)換為加法;
補(bǔ)充: CPU = ALU + CU; 中央處理器=算術(shù)邏輯單元 + 控制單元;
【引入補(bǔ)碼的背景】
?以時(shí)鐘為例:現(xiàn)在是6點(diǎn);要想時(shí)鐘走到3點(diǎn),有兩種方法:
- 方法1: 逆時(shí)針撥動(dòng)3個(gè)單元(減3);
- 方法2: 順時(shí)針撥動(dòng)9個(gè)單元(加9);
以上兩種方法的效果一樣(3與9之和為12,mod12),借助以上實(shí)例,容易理解補(bǔ)碼;
注意:負(fù)小數(shù)點(diǎn)補(bǔ)碼都是取模2;
為啥是模2,因?yàn)樨?fù)整數(shù)x的補(bǔ)碼是 2^(n+1) + x ,其中n為整數(shù)數(shù)值部分位數(shù); 又負(fù)小數(shù)的整數(shù)位數(shù)為0,所以負(fù)小數(shù)的補(bǔ)碼等于 2^(0+1)+x = 2+x ;
以上公式模擬推導(dǎo)過程(轉(zhuǎn)自視頻截圖):
問題: -1011的補(bǔ)數(shù)為+0101; 那 +0101表示的是 -1011的補(bǔ)數(shù),還是+0101本身呢?
解決方法:
正數(shù)+0101 表示為 0,0101 (符號(hào)位,數(shù)值部分)正數(shù)補(bǔ)碼添上1個(gè)0;
負(fù)數(shù)-1011 表示為 1,0101 (符號(hào)位,數(shù)值部分)負(fù)數(shù)補(bǔ)碼添上1個(gè)1 ;
【負(fù)數(shù)】如何實(shí)現(xiàn)在負(fù)數(shù)補(bǔ)碼的符號(hào)位設(shè)置為1?經(jīng)觀察發(fā)現(xiàn)(也可以通過數(shù)學(xué)歸納法證明出來)負(fù)數(shù)加上2^(n+1) 得到其補(bǔ)碼;n為原碼的位數(shù);
取模2^(n+1) ;n=數(shù)值位數(shù);
2^(4+1) - 1011=1,0101 ;計(jì)算過程如下:
100000
-1011
?=11111 – 1011 + 1 = 10100 + 1 = 10101 ;而補(bǔ)碼10101是真值-1011的原碼1,1011 的數(shù)值部分每位取反(得到10100),末位加1獲得的;
【正數(shù)】補(bǔ)碼也可以通過加上 2^(n+1) 來計(jì)算補(bǔ)碼;
如正數(shù)真值=+1011
01011
? +100000
? =101011
(紅色1被丟棄)
【求補(bǔ)碼的快捷方式】
計(jì)算補(bǔ)碼快捷方式:當(dāng)真值為負(fù)數(shù)(注意是負(fù)數(shù)),原碼符號(hào)位不變,數(shù)值部分每位取反,末位加1即可得到補(bǔ)碼;
例子:
例子2:已知 x補(bǔ) = 0.0001 ,求x(真值);
- 因?yàn)?x補(bǔ)=x;所以x=+0.0001;
例子3:已知 x補(bǔ)=1.0001;求x(真值) ?
- 因?yàn)閤補(bǔ)=2+x;
- 所以x(真) = x補(bǔ) - 2 = 1.0001 - 10.0000 = -(10.0000 - 1.0001) = -0.1111
- 所以 x真=-0.1111 ;x原=1.1111 ;x補(bǔ)=1.0001 ;
通過觀察(或數(shù)學(xué)歸納法證明),我們發(fā)現(xiàn):
第3點(diǎn),以X= -5 為例;
5的補(bǔ)碼,原碼均為 0,0101 ;即【5】補(bǔ)=0,0101
-5的補(bǔ)碼等于 1,【-5】原碼=1,0101 符號(hào)位不變,數(shù)值部分每位取反,末位加1,得到
【-5】補(bǔ)=1,1011;
得出:【-5】補(bǔ)等于【5】補(bǔ)的符號(hào)位取反,數(shù)值各位取反末位加1 得到;?
【3】反碼
反碼: 和補(bǔ)碼類似,把減法轉(zhuǎn)換為加法;
通過觀察(或數(shù)學(xué)歸納法證明),我們發(fā)現(xiàn):
例子:
總結(jié)
- 上一篇: linux磁盘大小命令(linux 磁盘
- 下一篇: 指令寻址方式与数据寻址方式