计算机组成原理 – 计算篇
章节导学
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
十进制(小数)转换二进制
十进制(小数)转换二进制:重复相乘法
- 重复乘以2
- 得积
- 取整数部分
- 结果按正序排列
十进制(分数)转换二进制
十进制(分数)转换二进制:重复相乘法
- 重复乘以2
- 得积:
把假分数化为真分数
- 取1:
取第一个数值
- 结果按正序排列
例: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 二进制的原码表示法
原码表示法特点
- 规定符号位位于数值第一位
- 使用0表示正数、1表示负数
- 表达简单明了,是人类最容易理解的表示法
0在原码中有两种表示方法:00、10
原码进行运算非常复杂,特别是两个操作数符号不同的时候
2.3 二进制的补码表示法
补码的定义
例子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
引进补码的目的
-
使用加法代替减法操作,从而消除减法
-
减法运算复杂,希望找到使用正数替代负数的方法
但在计算补码的过程中,还是使用了减法!!
2.4 二进制的反码表示法
反码的定义
例子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
2.5 小数的二进制补码表示
二进制小数的补码定义
负数的反码等于原码除符号位外按位取反
负数的补码等于反码+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 定点数的表示方法
定点数:小数点固定在某个位置的数称之为定点数
3.1.2 浮点数的表示方法
浮点数的表示格式
举例引入:
123450000000 = 1.2345 × 1011(科学计数法)
1.2345:尾数
10:基数 11:阶码
浮点数的表示格式
S:尾数 , r:基数 , j:阶码
举例
11.0101 = 0.110101 × 210
11.0101 = 0.0110101 × 211
浮点数的表示范围
阶码表示范围: [−(𝟐𝒎 − 𝟏), 𝟐𝒎 − 𝟏]
尾数表示范围: [−(𝟏 − 𝟐−𝒏), −(𝟐−𝒏)] [𝟐−𝒏, 𝟏 − 𝟐−𝒏]
浮点数的规格化
- 尾数规定使用纯小数
- 尾数最高位必须是1
举例
123450000000 = 1.2345 × 1011
错误写法:
举例
11.0101 = 0.110101 × 210
错误写法:
例子1:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数 13/128表示为二进制浮点数。
- 利用重复相乘法求出原码
- 原码=反码=补码:𝑥 = 0.0001101000
例子2:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数−54表示为二进制浮点数。
- 原码: 𝑥 = 1,110110
3.1.3 定点数与浮点数的对比
- 当定点数与浮点数位数相同时,浮点数表示的范围更大
- 当浮点数尾数为规格化数时,浮点数的精度更高
- 浮点数运算包含阶码和尾数,浮点数的运算更为复杂
- 浮点数在数的表示范围、精度、溢出处理、编程等方面均优于定点数
- 浮点数在数的运算规则、运算速度、硬件成本方面不如定点数
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
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
A[补] + B[补]= (A + B)[补] =1,1.1100010
A + B =-0.0011110
数值位与符号位一同运算,并将符号位产生的进位自然丢掉
例子3:A=-10010000, B=-01010000,求A+B
A[补] = 1, 01110000
B[补] = 1, 10110000
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
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
再来看例子3:A=-10010000, B=-01010000,求A+B
A[补] = 1, 01110000
B[补] = 1, 10110000
(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)[补]
A + (−B)[补] = 0,11111100
A − B = 111111100 (正数的补码还是自身)
3.3 浮点数的加减法运算
𝑥 = 𝑆𝑥 × 𝑟𝑗𝑥
𝑦 = 𝑆𝑦 × 𝑟𝑗y
操作流程
3.3.1 对阶
- 浮点数尾数运算简单
- 浮点数位数实际小数位与阶码有关
- 阶码按小阶看齐大阶的原则
- 対阶的目的是使得两个浮点数阶码一致,使得尾数可以进行运算
举例
𝑥 = 0.1101 × 201 , 𝑦 = (−0.1010) × 211, 求 x+y
3.3.2 尾数求和
- 使用补码进行运算
- 对于减法运算要转化为加法运算:A – B = A + (-B)
3.3.3 尾数规格化(左移)
对补码进行规格化需要判断两种情况:S>0 和 S<0
-
S[补] = 00.1xxxxxx(𝑆 > 0)
-
S[补] = 11.0xxxxxx(𝑆 < 0)
符号位与最高位不一致
如果不满足此格式,即符号位与最高位一致, 需要进行左移,同时阶码相应变化,以满足规格化
因此:𝑥 + 𝑦 = −0.1110 × 210
3.3.4 尾数规格化(右移)
- 一般情况下都是左移
- 双符号位不一致下需要右移 (定点运算的溢出情况)
- 右移的话则需要进行舍入操作
3.3.5 舍入
- “0舍1入”法(二进制的四舍五入)
例1:
S [补] = 10.10110111
S [补] = 11.01011011(1) 【1次尾数右移,记得阶码要+1哦】
例2:
S [补] = 01.11111111
S [补] = 00.10000000(1)
S [补] = 01.00000000
S [补] = 00.1000000(0)【两次右规,记得阶码要+2哦】
3.3.6 溢出判断
- 定点运算双符号位不一致为溢出
- 浮点运算尾数双符号位不一致不算溢出【因为尾数双符号位可以进行右规】
- 浮点运算主要通过阶码的双符号位判断是否溢出
- 如果规格化后,阶码双符号位不一致,则认为是溢出
例子:𝑥 = 0.11010011 × 21101,𝑦 = 0.11101110 × 21100,假设阶码4位,尾数8位,计算x + y
𝑥 + 𝑦[原] = 𝑥 + 𝑦[补] = 0.10100101 × 21110
3.3.7 浮点数的加减法运算总结
尾数右移1位:阶码加1
尾数左移1位:阶码减1
3.4 浮点数的乘除法运算
这部分作为了解
𝑥 = 𝑆𝑥 × 𝑟𝑗𝑥
𝑦 = 𝑆𝑦 × 𝑟𝑗y
乘法:阶码相加,尾数求积
𝑥 × 𝑦 = ( 𝑆𝑥 × 𝑆𝑦 ) × 𝑟(𝑗𝑥+𝑗y)
除法:阶码相减,尾数求商
𝑥/𝑦 = ( 𝑆𝑥 / 𝑆𝑦 ) × 𝑟(𝑗𝑥−𝑗y)
操作流程
例子:𝑥 = 0.11010011 × 21101,𝑦 = 0.11101110 × 20001,假设阶码4位,尾数8位,计算x * y
𝑥 × 𝑦 = ( 𝑆𝑥 × 𝑆𝑦 ) × 𝑟(𝑗𝑥+𝑗y)
= (0.11010011 × 0.11101110) × 𝑟1101+0001
= 0.11000100(保留八位) × 𝑟1110