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