计算机组成原理 – 计算篇

章节导学

1. 进制运算的基本知识

 

 

1.1 进制概述

 

  1. 进制的定义

    • 有限种数字符号来表示无限的数值
    • 进位制是一种记数方式,亦称进位计数法或位值计数法
  • 使用的数字符号的数目称为这种进位制的基数或底数

 

  1. 常见的进制

    • 二进制
    • 八进制
    • 十六进制
    • 二十进制
    • 六十进制

 

 

1.2 二进制运算的基础

 

二进制(整数)转换十进制

二进制(整数)转换十进制:按权展开法

正整数N,基数为r

𝑁 = 𝑑𝑛−1𝑑𝑛−2 ⋯ 𝑑1𝑑0

= 𝑑𝑛−1r𝑛−1 +𝑑𝑛−2 r𝑛−2 + ⋯ + 𝑑1𝑟 + 𝑑0

 

例:𝑁 = 01100101 = 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 22 + 1 = 101

例:𝑁 = 11101101 = 1 ∗ 27 + 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 23 + 1 ∗ 22 + 1 = 237

 

 

 

十进制(整数)转换二进制

十进制(整数)转换二进制:重复相除法

例:(101)10 = ( )2

重复除以2 得商 取余数  
101/2 50 1  
50/2 25 0
25/2 12 1
12/2 6 0
6/2 3 0
3/2 1 1
1/2 0 1  
二进制结果 01100101    

𝑁 = (01100101)2 = 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 22+ 1 = (101)10

 

例:23710 = ( )2

重复除以2 得商 取余数  
237/2 118 1  
118/2 59 0
59/2 29 1
29/2 14 1
14/2 7 0
7/2 3 1
3/2 1 1  
1/2 0 1  
二进制结果 11101101    

𝑁 = (11101101)2 = 1 ∗ 27 + 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 23 + 1 ∗ 2^2 + 1 = (237)10

 

二进制(小数)转换十进制

二进制(小数)转换十进制:按权展开法

小数N,基数为r,从小数点右边开始,小数点左边为正,右边为负

𝑁 = 𝑑𝑛−1𝑑𝑛−2 ⋯ 𝑑1𝑑0

= 𝑑𝑛−1r𝑛−1 +𝑑𝑛−2 r𝑛−2 + ⋯ + 𝑑1𝑟 + 𝑑0

 

例:𝑁 = (0.11001) = 1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−5 = 0.78125 = 25/32

:𝑁 = (0.01011) = 1 ∗ 2−2 + 1 ∗ 2−4 + 1 ∗ 2−5 = 0.34375 = 11/32

 

十进制(小数)转换二进制

十进制(小数)转换二进制:重复相乘法

  1. 重复乘以2
  2. 得积
  3. 取整数部分
  4. 结果按正序排列

 

十进制(分数)转换二进制

十进制(分数)转换二进制:重复相乘法

  1. 重复乘以2
  2. 得积:把假分数化为真分数
  3. 取1:取第一个数值
  4. 结果按正序排列

 

例:25/32转化为二进制

重复乘以2 得积 取1  
25/32 50/32= 1+9/16 1
9/16 18/16= 1+1/8 1
1/8 1/4= 0+1/4 0
1/4 1/2= 0+1/2 0
1/2 1= 1+0 1
二进制结果 0.11001    

𝑁 = 0.11001 = 1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−5 = 0.78125=25/32

 

例:11/32转化为二进制

重复乘以2 得积 取1  
11/32 11/16= 0+11/16 0
11/16 11/8= 1+3/8 1
3/8 3/4= 0+3/4 0
3/4 3/2= 1+1/2 1
1/2 1/1= 1+0 1
二进制结果 0.01011    

𝑁 = 0.01011 = 1 ∗ 2−2 + 1 ∗ 2−4 + 1 ∗ 2−5 = 0.34375 = 11/32

 

 

 

 

 

2. 二进制数据的表示方法

2.1 有符号数与无符号数

+表示正数,-表示负数

 

2.2 二进制的原码表示法

image-20201113105943054

 

原码表示法特点

  1. 规定符号位位于数值第一位
  2. 使用0表示正数、1表示负数
  3. 表达简单明了,是人类最容易理解的表示法

 

0在原码中有两种表示方法:00、10

原码进行运算非常复杂,特别是两个操作数符号不同的时候

 

 

2.3 二进制的补码表示法

补码的定义

image-20201113101511007

例子1:n=4,x=13,计算x的二进制原码和补码

原码:x=0,1101

补码:x=0,1101

 

例子2:x=-13,计算x的二进制原码和补码

原码:x=1,1101

补码:2𝑛+1 + 𝑥 = 24+1 − 13 = 100000 1101 = 1 0011(高亮部分为符号位)
补码:x=1,0011

例子3:x=-7,计算x的二进制原码和补码

原码:x=1,0111

补码:2𝑛+1 + 𝑥 = 24+1 − 7 = 100000 0111 = 1 1001
补码:x=1,1001

 

例子4:x=-1,计算x的二进制原码和补码

原码:x=1,0001

补码:2𝑛+1~ + 𝑥 = 24+1 − 1 = 100000 0001 = 1 1111
补码:x=1,1111

 

引进补码的目的

  1. 使用加法代替减法操作,从而消除减法

  2. 减法运算复杂,希望找到使用正数替代负数的方法

    但在计算补码的过程中,还是使用了减法!!


 

2.4 二进制的反码表示法

反码的定义

03

例子1:x=-13,计算x的二进制原码和反码

原码:x=1,1101

反码:(2𝑛+1−1) + 𝑥 = (24+1−1)− 13 = 011111 1101 = 1 0010(高亮部分为符号位)
反码:x=1,0010

 

例子2:x=-7,计算x的二进制原码和反码

原码:x=1,0111

反码:(2𝑛+1−1) + 𝑥 = (24+1−1) − 7= 011111 0111 = 1 1000
反码:x=1,1000

 

从以上两个例子中可以看出按照定义求反码依然有减法

 

引进反码的目的

消除减法

 

通过以下规则求反码可以消除减法的出现

负数的反码等于原码除符号位外按位取反

负数的补码等于反码+1

 

例子3:x=-7,计算x的二进制原码和反码和补码

原码:x=1,0111

反码:x=1,1000

补码:x=1,1001

 

例子4:x=-9,计算x的二进制原码和反码和补码

原码:x=1,1001

反码:x=1,0110

补码:x=1,0111


image-20201113104912542

 

2.5 小数的二进制补码表示

二进制小数的补码定义

image-20201113105142340

 

负数的反码等于原码除符号位外按位取反

负数的补码等于反码+1

 

例子1:x= 9/16,计算x的二进制原码和反码和补码

原码:x=0,0.1001 (重复相乘法)

反码:x= 0,0.1001

补码:x= 0,0.1001

 

例子2:x= -11/32,计算x的二进制原码和反码和补码

原码:x=1,0.01011 (重复相乘法)

反码:x=1,1.10100

补码:x=1,1.10101


 

 

 

 

 

3. 二进制数据的运算

3.1 定点数与浮点数

 

3.1.1 定点数的表示方法

定点数:小数点固定在某个位置的数称之为定点数

image-20201118212510531

 

 

3.1.2 浮点数的表示方法

 

浮点数的表示格式

 

举例引入:

123450000000 = 1.2345 × 1011(科学计数法)

1.2345:尾数

10:基数 11:阶码

 

浮点数的表示格式

S:尾数 , r:基数 , j:阶码

image-20201118213424272

举例

11.0101 = 0.110101 × 210
11.0101 = 0.0110101 × 211

image-20201118213510860

 

 

 

 

 

浮点数的表示范围

 

阶码表示范围: [−(𝟐𝒎 − 𝟏), 𝟐𝒎 − 𝟏]

尾数表示范围: [−(𝟏 − 𝟐−𝒏), −(𝟐−𝒏)] [𝟐−𝒏, 𝟏 − 𝟐−𝒏]

image-20201118213906567

 

 

 

 

浮点数的规格化
  1. 尾数规定使用纯小数
  2. 尾数最高位必须是1

 

举例

123450000000 = 1.2345 × 1011

错误写法:

image-20201118214058329

 

举例

11.0101 = 0.110101 × 210

错误写法:

image-20201118214207080

 

例子1:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数 13/128表示为二进制浮点数。

  • 利用重复相乘法求出原码
  • 原码=反码=补码:𝑥 = 0.0001101000

image-20201118214337933

 

例子2:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数−54表示为二进制浮点数。

  • 原码: 𝑥 = 1,110110

image-20201118214412515

 

 

3.1.3 定点数与浮点数的对比

  1. 当定点数与浮点数位数相同时,浮点数表示的范围更大
  2. 当浮点数尾数为规格化数时,浮点数的精度更高
  3. 浮点数运算包含阶码和尾数,浮点数的运算更为复杂
  4. 浮点数在数的表示范围、精度、溢出处理、编程等方面均优于定点数
  5. 浮点数在数的运算规则、运算速度、硬件成本方面不如定点数

 

 

 

 

 

3.2 定点数的加减法运算

3.2.1 加法运算

整数加法:A[补] + B[补] = (𝐴 + 𝐵)[补] (𝑚𝑜𝑑2𝑛+1)

小数加法:A[补] + B[补] = (𝐴 + 𝐵)[补] (𝑚𝑜𝑑2)

数值位与符号位一同运算,并将符号位产生的进位自然丢掉

 

例子1:A=-110010, B=001101,求A+B

A[补] = 1,001110

B[补]= B[原] = 0,001101

image-20201118220327186

A[补] + B [补]= (A + B) [补] =1,011011

A + B = −100101

数值位与符号位一同运算,并将符号位产生的进位自然丢掉

 

例子2:A=-0.1010010, B=0.0110100,求A+B

A[补] = 1,1.0101110

B[补] = B[原] = 0,0.0110100

image-20201118220445668

A[补] + B[补]= (A + B)[补] =1,1.1100010

A + B =-0.0011110

数值位与符号位一同运算,并将符号位产生的进位自然丢掉

 

例子3:A=-10010000, B=-01010000,求A+B

A[补] = 1, 01110000

B[补] = 1, 10110000

image-20201118220518078

A[补] + B[补] = (A + B)[补] =1,00100000

A + B =-11100000

验证:A = −144, B = −80 , A + B = −224

数值位与符号位一同运算,并将符号位产生的进位自然丢掉

 

 

例子4:A=-10010000, B=-11010000,求A+B

A[补] = 1, 01110000

B[补] = 1, 00110000

image-20201118220843780

A[补] + B[补] = (A + B) 补 = 0,10100000

A + B = 10100000

验证:

A = −144, B = −208, A + B = 160

数值位与符号位一同运算,并将符号位产生的进位自然丢掉

 

 

 

3.3.2 判断溢出

  • 双符号位判断法

    • 单符号位表示变成双符号位:0=>00, 1=>11
    • 双符号位产生的进位丢弃
    • 结果的双符号位不同则表示溢出

 

再来看例子4:A=-10010000, B=-11010000,求A+B

A[补] = 1, 01110000

B[补] = 1, 00110000

image-20201118221410615

image-20201118221518102

 

再来看例子3:A=-10010000, B=-01010000,求A+B

A[补] = 1, 01110000

B[补] = 1, 10110000

image-20201118221628551

image-20201118221718907

(A + B)[原] = 11,11100000 = −11100000

 

 

3.2.3 减法运算

整数减法:A[补] − B[补] = 𝐴 + (−𝐵)[补] (𝑚𝑜𝑑2𝑛+1)

小数减法:A[补] − B[补] = 𝐴 + (−𝐵)[补] (𝑚𝑜𝑑2)

-B[补]等于B[补]连同符号位按位取反,末位加一

B[补] = 1,0010101

(−B)[补] = 0,1101011

 

例子5:A=11001000, B=-00110100,求A-B

A[补] = A[原] = 0,11001000

B[补] = 1,11001100

(−B)[补] = 0,00110100

A[补] − B[补] = A[补] + (−B)[补] = A + (−B)[补]

image-20201118222127656

A + (−B)[补] = 0,11111100

A − B = 111111100 (正数的补码还是自身)

 

 

 

3.3 浮点数的加减法运算

 

𝑥 = 𝑆𝑥 × 𝑟𝑗𝑥
𝑦 = 𝑆𝑦 × 𝑟𝑗y

操作流程

image-20201118231637730

 

 

3.3.1 对阶

  • 浮点数尾数运算简单
  • 浮点数位数实际小数位与阶码有关
  • 阶码按小阶看齐大阶的原则
  • 対阶的目的是使得两个浮点数阶码一致,使得尾数可以进行运算

 

举例

𝑥 = 0.1101 × 201 , 𝑦 = (−0.1010) × 211, 求 x+y

image-20201118231740745

 

3.3.2 尾数求和

  • 使用补码进行运算
  • 对于减法运算要转化为加法运算:A – B = A + (-B)

image-20201118231921718

image-20201118231949399

 

 

3.3.3 尾数规格化(左移)

对补码进行规格化需要判断两种情况:S>0 和 S<0

  1. S[补] = 00.1xxxxxx(𝑆 > 0)

  2. S[补] = 11.0xxxxxx(𝑆 < 0)

    符号位与最高位不一致

如果不满足此格式,即符号位与最高位一致, 需要进行左移,同时阶码相应变化,以满足规格化

 

image-20201118232341946

image-20201118232411391

因此:𝑥 + 𝑦 = −0.1110 × 210

 

 

3.3.4 尾数规格化(右移)

  1. 一般情况下都是左移
  2. 双符号位不一致下需要右移 (定点运算的溢出情况)
  3. 右移的话则需要进行舍入操作

 

3.3.5 舍入

  • “0舍1入”法(二进制的四舍五入)

 

例1:

S [补] = 10.10110111

S [补] = 11.01011011(1) 【1次尾数右移,记得阶码要+1哦】

image-20201118233056714

例2:

S [补] = 01.11111111

S [补] = 00.10000000(1)

image-20201118234956515

S [补] = 01.00000000

S [补] = 00.1000000(0)【两次右规,记得阶码要+2哦】

 

3.3.6 溢出判断

  • 定点运算双符号位不一致为溢出
  • 浮点运算尾数双符号位不一致不算溢出【因为尾数双符号位可以进行右规】
  • 浮点运算主要通过阶码的双符号位判断是否溢出
  • 如果规格化后,阶码双符号位不一致,则认为是溢出

 

例子:𝑥 = 0.11010011 × 21101,𝑦 = 0.11101110 × 21100,假设阶码4位,尾数8位,计算x + y

 

image-20201118233642586

image-20201118233656618

image-20201118233709618

image-20201118233738582

 

𝑥 + 𝑦[原] = 𝑥 + 𝑦[补] = 0.10100101 × 21110

 

 

 

3.3.7 浮点数的加减法运算总结

image-20201118233855044

尾数右移1位:阶码加1

尾数左移1位:阶码减1

 

 

 

 

3.4 浮点数的乘除法运算

这部分作为了解

 

𝑥 = 𝑆𝑥 × 𝑟𝑗𝑥
𝑦 = 𝑆𝑦 × 𝑟𝑗y

乘法:阶码相加,尾数求积

𝑥 × 𝑦 = ( 𝑆𝑥 × 𝑆𝑦 ) × 𝑟(𝑗𝑥+𝑗y)

除法:阶码相减,尾数求商

𝑥/𝑦 = ( 𝑆𝑥 / 𝑆𝑦 ) × 𝑟(𝑗𝑥−𝑗y)

 

操作流程

image-20201118234207111

 

 

例子:𝑥 = 0.11010011 × 21101,𝑦 = 0.11101110 × 20001,假设阶码4位,尾数8位,计算x * y

𝑥 × 𝑦 = ( 𝑆𝑥 × 𝑆𝑦 ) × 𝑟(𝑗𝑥+𝑗y)

= (0.11010011 × 0.11101110) × 𝑟1101+0001

= 0.11000100(保留八位) × 𝑟1110