定點數的表示
重點,難點
無符號數:整個機器字長的全部二進制位均為數值位,沒有符號位,相當於數的絕對值。
1001 1100B
寄存器的長度直接反映出了無符號數的表示范圍。
表示范圍:
8位二進制數:2的8次方種不同狀態
0000 0000 ~ 1111 1111 = 1 0000 0000 - 1
0~255=2^8 - 1
有符號數:
+156D = 0 1001 1100B
-156D = 1 1001 1100B
真值 機器數
小數點怎么辦?
沒有專門硬件表示小數點。按約定來表示的
小數點:隱含存儲(定點數:事先約定;浮點數:按規則浮動)
原碼
有符號數:
- 原碼表示法
- 補碼表示法
- 反碼表示法
- 移碼表示法
原碼:
符號+真值
如果是負數的話,前面多一個1,所以有2的n次方
2的n次方減去真值(因為是負值)部分。
實際上就是絕對值 + 1或者0
純小數
原碼的特點:簡單、直觀
補碼
原碼在加減的情況會出現問題
如何把減法統一成加法?
時鍾,模12
補數:
一個負數加上“模”即得到該負數的補數
補碼:
對於正數,補碼與原碼的表示相同
對於負數,原碼符號位不變,數值部分按位取反,末位加1(取反加一)
小數還是純小數
反碼
對於正數,反碼與原碼的表示相同
對於負數,原碼符號位不變,數值部分按位取反。
表示范圍:原碼一樣
原補反相互轉換
最高位為符號位,書寫上用“,”(整數)或“.”(小數)將數值部分和符號位隔開。
對於正數,原碼=補碼=反碼
對於負數,符號位為1,其數值部分
原碼除符號位外每位取反末位加1->補碼
原碼除符號位外每位取反->反碼
移碼
用來干啥的?
補碼是很難表示真值的大小的。
移碼就是在真值X上加上一個常數(偏置值),通常這個常數去2的n次方。
只有整數才有移碼
定點數的運算
- 移位運算
- 加減
- 溢出判斷
- 乘除
- 強制類型轉換
移位運算
左移:絕對值擴大
右移:絕對值縮小
和加減法結合實現了乘除法
算術移位:機器碼采用有符號數
符號位不參與移位
正數:原碼、補碼、反碼都一樣->左移右移都補0
負數:反碼1,原碼0,補碼左移0右移1
原碼算術移位:左移丟1,運算出錯;右移丟1,影響精度。
邏輯移位
機器數采用無符號數:邏輯移位
邏輯左移時,高位移丟,低位添0
邏輯右移時,低位移丟,高位添0
循環移位(了解即可)
最高位添到最低位。
加減運算
補碼:兩個有符號數可以直接相加,不需要分類討論
加減法的基本思路:
- 轉化為x+y的形式
- 計算兩個補碼的相加
做題。
符號擴展
-B的補碼:連通符號位一起取反
-c的補碼:連同符號位一起取反。
溢出判斷
如何判斷溢出?
一:
兩個整數相加,符號位變成1
兩個負數相加,符號位變成0
邏輯表達式
與:如ABC,表示A與B與C,僅當A、B、C均為1時,ABC為1,A、B、C中有一個或多個為0,則ABC為0
或:如A+B+C,表示A或B或C,僅當A、B、C均為0時,A+B+C為0,ABC中有一個或多個是1,則A+B+C為1
非:如Abar,表示A非,取反。
二:
采用一位符號位。根據數據位進位情況判斷溢出
三:
采用雙符號位
正數符號為00,負數符號為11
乘法運算(了解過程)
直接做題。
原碼一位乘法
計算機用兩個寄存器(累加器(保存機器字長),乘商寄存器(保存乘數的絕對值))
初始累加器里的值000000.
乘商寄存器最右邊那個數字是1,則豎式+x
如果是0,就+00000,豎式不變
做一次操作寫進累加器里,然后豎式里、ACC、MQ右移一位。
一直從MQ里移出來的值變成乘數后,結束。
ACC和MQ里全部就是結果
補碼一位乘法
Booth算法。原理不需要掌握。
第一步,先求出補碼。用兩位符號位
乘法運算回顧:
除法運算(了解過程)
符號位和數值位分開處理
筆算:
原碼恢復余數法
符號位數值位分開處理
首先把絕對值寫出來,在寫出y絕對值補碼,y的絕對值相反數的補碼
加上y的y的絕對值相反數的補碼,判斷是不是大於y的
不是商0,是商1,左移
原碼不恢復余數法
若余數為負數,
需要加回。
補碼加減交替法
先求出補碼和負數的補碼(原碼是要求絕對值的補碼)
被除數和除數同號,則被除數減去除數;異號則被除數加上除數。
余數和除數同號,商1,余數左移一位減去除數;
余數和除數異號,商0,余數左移一位加上除數。
重復n次。
末尾恆置1
除法運算總結回顧
用十進制算不香嘛?
強制類型轉換
無符號數與有符號數:不改變數據內容,改變解釋方式
short x = -4321; //short占用2個字節
unsigned short y = (unsigned short)x;
x: 1110 1111 0001 1111
y:1110 11110001 1111——真值:61215
長整數變短整數:高位截斷,保留地位。
int a = 165537,b=-34991; //int占用4個字節
short c = (short)a, d = (short)b;
a:0x000286a1
c:0x86a1——真值-31071
b:0xffff7751
d:0x7751——真值30545
短整數變長整數:符號拓展
short x = -4321;
int m = x;
unsigned short n = (unsigned short)x;
unsigned int p = n;
x:1110 1111 0001 1111
m:1111 1111 1111 1111 1110 1111 0001 1111——真值-4321
n:1110 1111 0001 1111——真值61215
p:0000 0000 0000 0000 1110 1111 0001 1111——真值61215