本文内容整理自西安交通大学软件学院李晨老师的课件,仅供学习使用,请勿转载
计算机组成原理系列笔记汇总:计算机组成原理笔记及思维导图汇总附复习建议_Qlz的博客-CSDN博客
文章目录
文章目录
本章思维导图
Arithmetic & Logic Unit
- Does the calculations
- Everything else in the computer is there to serve this unit
- Controller, registers, memory, I/O
- Handles integers, floating point (real) numbers
Integer Representation
Sign-Magnitude Representation
- Left most bit is sign bit
- 0 means positive
- 1 means negative
- +18 = 00010010
- -18 = 10010010
- Problems
- Need to consider both sign and magnitude in arithmetic
- Two representations of zero (+0 and -0)
- Rarely used
补码
- 对于正数来说不变
- 对于负数来说,补码是原码除符号位按位取反再加一
Conversion Between Lengths
- Positive number pack with leading zeros
- +18 = 00010010
- +18 = 00000000 00010010
- Negative numbers pack with leading ones
- -18 = 11101110
- -18 = 11111111 11101110
- Extension rule of complement: left pack sign bit(左面补符号位)
Integer Arithmetic
A n-bit binary : $ [-2n-1,2{n-1}-1]$
Comment on Addition and Subtraction
- Normal binary addition
- Monitor sign bit for overflow
- Overflow Rule: 当两个正数或者两个负数相加时,如果结果的符号位发生改变,则说明发生了溢出(overflow)
硬件实现
首先需要两个寄存器存储待计算的数字,A寄存器中存的是加数或者被减数,B中存的是减数或者另一个加数,由SW部分检测当前是进行减法还是加法,然后选择对应的输入
- 如果是加法的话直接将B寄存器中的值放入加法器中即可,
- 如果是减法,则需要将B寄存器中的值经过补码换算后再放入加法器
在计算结束后将结果存放到A寄存器中(一般都是A),同时需要检查结果是否溢出
Multiplication
By computer
- More efficient
- Addition on partial product rather than waiting until the end
- No need for storage all the partial products, fewer registers are needed
- Save some time
- **For each 1 on the multiplier, an addition and a shift operation are required, but for each 0, only a shift is required ** 对于乘数当前位为1的话,那么需要进行一次加法和一次移位操作,如果是0的话,则只需要移位操作就够了
硬件实现
总共需要三个寄存器,一个用来存储被乘数(M),一个用来存储乘数(Q),一个用来存储部分值(A),还额外需要一位存加法的进位
对于每一次操作,都需要从乘数的最低位取出一位值,将其输入Shift and Add Control Logic 中,
- 如果输入的值为1,则使能加法器进行加法操作,将被乘数(M)与部分和(A)进行相加的结果放入A中,同时,将下方的寄存器组全部向右移一位
- 如果输入的值为1,则直接进行向右移位操作(由于乘的数是0,相当于加0,因此可以省略加法)
最终的2n位结果就存储在A和Q中
例子
Flowchart for Unsigned Binary Multiplication
负数乘法
- 对于负数来说,直接将符号位当成一位数字去进行运算的话,最终结果是错误的
- 计算方法
- 方法一:先将复数转化为正数,按照上面说的方法运算,如果最后得到的也是复数,那么修改符号位即可
- 方法二:booth算法
例子
两正数
一正一负
手算(不会)
Division
More complex than multiplication
计算方法
主要思想:将被减数向左移位,然后减除数,如够减本位记0,如果不够减本位记1
需要三个寄存器,M中放的是被除数,Q中放的是除数,A中保存的是中间值,然后Count中保存的是被除数的位数
在每一次计算前,都需要将A和Q向左移一位,同时将A-M的值赋值给A,然后判断A的值是否大于0
- 如果大于0,那么在Q0的位置插入1
- 如果小于0,那么在Q0的位置插入0,同时将A的值修改为A当前的值加M,即恢复A的值
当Count值为0是停止计算
此时,A中存储的是余数(Remainder),Q中存储的是商(Quotient)
例子
负数除法
类似负数乘法,也有两种方式
- 方法一:将数字转化为正数,然后按照上述方法计算,在结束后判断是否需要修改符号位
- 方法二:如下
老师没讲,应该只是了解一下
Floating Point Representation
Real Numbers
- Numbers with fractions
- Could be done in pure binary
- 1001.1010 = 2 4 + 2 0 + 2 − 1 + 2 − 3 = 9.625 1001.1010 = 2^4 + 2^0 +2^{-1} + 2^{-3} =9.625 1001.1010=24+20+2−1+2−3=9.625
- 存在一个问题是小数点没法表示
- 如果小数点固定的话,那么表示的数字范围就非常小
- 如果是自由的话,那么应该怎么表示
Principles
- 表示方法:
±
S
×
B
±
E
±S\times B^{ ±E}
±S×B±E
- ±: Sign
- S: significand(尾数)
- E: exponent(幂), 在计算机中通常会加一个偏移量
- B: base is implicit, need not be stored
- Typically, the bias= 2 k − 1 − 1 2^{k-1}-1 2k−1−1
- k: number of bits of exponent
- E.g. 8-bit field, the bias is 127
- True exponent values :[-127,128]
- Exponent value= true exponent + bias
- 幂的值为其实际值加上偏移量,对于八位的幂来说,偏移量为 2 8 − 1 − 1 = 127 2^{8-1}-1=127 28−1−1=127
- 幂值存储的是一个无符号数
Typical 32-bit Float-point Format
对于第一个来说,由于其指数是一个正数,因此其幂值为 1 , 0100 + 0111 , 1111 = 1001 , 0011 1,0100+0111,1111=1001,0011 1,0100+0111,1111=1001,0011
对于第三个来说,由于其指数是一个负数,因此首先需要先将其转换为补码形式,然后再加偏移
- 原码: 1001 , 0100 1001,0100 1001,0100
- 反码: 1110 , 1011 1110,1011 1110,1011
- 补码: 1110 , 1100 1110,1100 1110,1100
- 加上偏移后: 1110 , 1100 + 0111 , 1111 = 0110 , 0111 1110,1100+0111,1111=0110,0111 1110,1100+0111,1111=0110,0111
Normalization
- 浮点数通常需要规范化,因为在表示中,通常使用的是科学计数法,由于标准科学计数法要保证小数点前的数字不能为0,对于二进制来说,小数点前的数字只能为1,因此在表示中会将小数点前的数省略,仅存储小数点后的数字,因此规范化需要保证小数点前的数为1
浮点数表示的范围
上面的图是 i n t int int类型可以表示的范围,下面是浮点数能表示的范围
对于浮点数能表示的范围计算如下(仅以正数作为说明,因为正数与负数的区别只有符号位,因此表示的区间大小是一样的,负数通过正数可以换算其范围)
-
最大值:要保证取得值是最大值,则对于正数来说,即符号位和尾数全部为1,即 0 1111 , 1111 111...11 ( 23 个 1 ) 0\ 1111,1111\ 111...11(23个1) 0 1111,1111 111...11(23个1),其表示的数是
1.111....11 ( 小 数 点 后 23 个 1 ) × 2 1111 , 1111 − 0111 , 1111 = 1.111....11 ( 小 数 点 后 23 个 1 ) × 2 128 = ( 2 − 2 23 ) × 2 128 1.111....11(小数点后23个1)\times 2^{1111,1111-0111,1111}=1.111....11(小数点后23个1)\times 2^{128}=(2-2^{23})\times 2^{128} 1.111....11(小数点后23个1)×21111,1111−0111,1111=1.111....11(小数点后23个1)×2128=(2−223)×2128 -
最小值:即符号位和尾数全部为0,即 0 0000 , 0000 000...00 ( 23 个 0 ) 0\ 0000,0000\ 000...00(23个0) 0 0000,0000 000...00(23个0),其表示的数是:
1.000....00 ( 小 数 点 后 23 个 0 ) × 2 0000 , 0000 − 0111 , 1111 = 1.000....00 ( 小 数 点 后 23 个 0 ) × 2 − 127 = 1 × 2 − 127 1.000....00(小数点后23个0)\times 2^{0000,0000-0111,1111}=1.000....00(小数点后23个0)\times 2^{-127}=1\times 2^{-127} 1.000....00(小数点后23个0)×20000,0000−0111,1111=1.000....00(小数点后23个0)×2−127=1×2−127
- 对于32位的浮点数来说,其指数位有8位,可以表示的范围大概为 + / − 2 128 ≈ 3.4 × 1 0 38 +/- 2^{128} \approx 3.4\times10^{38} +/−2128≈3.4×1038
- 精确度:大概为 2 − 23 = 1.2 × 1 0 − 7 2^{-23}=1.2\times10^{-7} 2−23=1.2×10−7
Density of Floating Point Numbers
Floating-point arithmetic
对于浮点数的加法和减法,必须确保操作数的指数值是一致的,通常采用的方法是小数向大数对其,这样可以保值其损失值更小
X
=
X
S
×
B
X
e
,
Y
=
Y
S
×
B
y
e
(
X
e
<
Y
e
)
X
+
Y
=
(
X
S
×
B
X
e
−
Y
e
+
Y
S
)
×
B
y
e
X
−
Y
=
(
X
S
×
B
X
e
−
Y
e
−
Y
S
)
×
B
y
e
X
×
Y
=
(
X
S
×
Y
S
)
×
B
X
e
−
Y
e
X
/
Y
=
(
X
S
×
Y
S
)
×
B
X
e
−
Y
e
X=X_S \times B^{X_e}, Y=Y_S \times B^{y_e} (X_e< Y_e)\\ X+Y=(X_S\times B^{X_e-Y_e} + Y_S) \times B^{y_e}\\ X-Y=(X_S\times B^{X_e-Y_e} -Y_S) \times B^{y_e}\\ X \times Y= (X_S\times Y_S ) \times B^{X_e-Y_e}\\ X/Y=(X_S\times Y_S ) \times B^{X_e-Y_e}
X=XS×BXe,Y=YS×Bye(Xe<Ye)X+Y=(XS×BXe−Ye+YS)×ByeX−Y=(XS×BXe−Ye−YS)×ByeX×Y=(XS×YS)×BXe−YeX/Y=(XS×YS)×BXe−Ye
对于加法和减法来说,向大数对其的意思是将其指数修改为和大数的指数位一样的值,将其尾数向右移动相同的位数
Floating-point operation may cause some problems
- Exponent overflow
- 指数上溢出,即 2 55 × 2 90 = 2 145 > 2 128 2^{55}\times 2^{90}=2^{145}>2^{128} 255×290=2145>2128
- Exponent underflow
- 指数下溢出,即 2 − 55 × 2 − 90 = 2 − 145 < 2 − 127 2^{-55}\times 2^{-90}=2^{-145}<2^{-127} 2−55×2−90=2−145<2−127
- Significant underflow
- 尾数下溢出,即小数向大数对其时向右移动导致的下溢出
- Significant overflow
- 尾数上溢出,即 1.1100 + 1.1000 = 10.0100 1.1100+1.1000=10.0100 1.1100+1.1000=10.0100,导致小数点前的数不为1,这时候需要规范化之后才能存储
加法与减法
步骤
- Check for zeros
- 对其有效位(调整指数)
- 移动较小操作数的尾数
- 一旦发生溢出对最后的结果影响比较小
- 尾数加减
- 规范化
乘法与除法
步骤
- Check for zero
- 加/减指数
- 记得要加或者减偏移
- 乘/除尾数
- 规范化
- Round
- 所有中间结果均应该存储在两倍大小长度的存储器中(保证精度)
IEEE 754 Formats
Key points
- Complement representation and arithmetic of signed binary
- Negatee
- ±x/ of integer
- Float point representation and arithmetic
Vocabulary
- Base: 基数
- Biased representation: 偏值表示法
- Dividend: 被除数
- Divisor: 除数
- Exponent: 指数
- Guard bits: 保护位
- Minuend: 被减数
- Multiplicand: 被乘数
- Multiplier: 乘数
- Overflow: 溢出
- Product: 积
- Quotient: 商
- Radix point: 小数点
- Remainder: 余数
- Rounding: 舍入
- Significand: 有效数
- Subtrahend: 减数
- Sign bit: 符号位