定點數的表示和運算


定點數的表示

重點,難點

無符號數:整個機器字長的全部二進制位均為數值位,沒有符號位,相當於數的絕對值。

1001 1100B

寄存器的長度直接反映出了無符號數的表示范圍。

表示范圍:

8位二進制數:2的8次方種不同狀態

0000 0000 ~ 1111 1111 = 1 0000 0000 - 1

0~255=2^8 - 1

\[n位無符號數表示范圍為:0 - 2^n-1 \]

有符號數:

+156D = 0 1001 1100B

-156D = 1 1001 1100B

真值 機器數

小數點怎么辦?

沒有專門硬件表示小數點。按約定來表示的

小數點:隱含存儲(定點數:事先約定;浮點數:按規則浮動)

\[有n位尾數的定點小數:-(1-2^{-n})... 1-2^{-n} \]

\[有n位尾數的定點整數:-(2^n-1)...(2^n-1) \]

原碼

有符號數:

  1. 原碼表示法
  2. 補碼表示法
  3. 反碼表示法
  4. 移碼表示法

原碼:

\[[x]_原=\left\{ \begin{array}{rcl} 0,x & & {2^n > x ≥ 0}\\ 2^n-x=2^n+|x| & & {0≥x>-2^n} \end{array} \right. \]

符號+真值

如果是負數的話,前面多一個1,所以有2的n次方

2的n次方減去真值(因為是負值)部分。

實際上就是絕對值 + 1或者0

\[若字長為n+1,則原碼整數的表示范圍為-(2^n-1)≤x≤2^n-1(關於原點對稱) \]

純小數

原碼的特點:簡單、直觀

補碼

原碼在加減的情況會出現問題

如何把減法統一成加法?

時鍾,模12

補數:

一個負數加上“模”即得到該負數的補數

補碼:

對於正數,補碼與原碼的表示相同

對於負數,原碼符號位不變,數值部分按位取反,末位加1(取反加一

\[若字長為n+1,則補碼的表示范圍為-2^n≤x≤2^n-1(比原碼多表示-2^n) \]

小數還是純小數

反碼

對於正數,反碼與原碼的表示相同

對於負數,原碼符號位不變,數值部分按位取反

表示范圍:原碼一樣

原補反相互轉換

最高位為符號位,書寫上用“,”(整數)或“.”(小數)將數值部分和符號位隔開。

對於正數,原碼=補碼=反碼

對於負數,符號位為1,其數值部分

原碼除符號位外每位取反末位加1->補碼

原碼除符號位外每位取反->反碼

移碼

用來干啥的?

補碼是很難表示真值的大小的。

移碼就是在真值X上加上一個常數(偏置值),通常這個常數去2的n次方。

只有整數才有移碼

定點數的運算

  1. 移位運算
  2. 加減
  3. 溢出判斷
  4. 乘除
  5. 強制類型轉換

移位運算

左移:絕對值擴大

右移:絕對值縮小

\[右移n位:/r^n,左移n位:*r^n \]

和加減法結合實現了乘除法

算術移位:機器碼采用有符號數

符號位不參與移位

正數:原碼、補碼、反碼都一樣->左移右移都補0

負數:反碼1,原碼0,補碼左移0右移1

原碼算術移位:左移丟1,運算出錯;右移丟1,影響精度。

邏輯移位

機器數采用無符號數:邏輯移位

邏輯左移時,高位移丟,低位添0

邏輯右移時,低位移丟,高位添0

循環移位(了解即可)

最高位添到最低位。

加減運算

補碼:兩個有符號數可以直接相加,不需要分類討論

加減法的基本思路:

  1. 轉化為x+y的形式
  2. 計算兩個補碼的相加

做題。

符號擴展

-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

回顧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM