计算机组成原理第九章笔记---计算机算术

本文内容整理自西安交通大学软件学院李晨老师的课件,仅供学习使用,请勿转载

计算机组成原理系列笔记汇总:计算机组成原理笔记及思维导图汇总附复习建议_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

image-20211104224926375.png

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),同时需要检查结果是否溢出

image-20211104230518823.png

Multiplication

image-20211104230927647.png

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中

image-20211104231205880.png

例子

image-20211104232222401.png

Flowchart for Unsigned Binary Multiplication

image-20211104232238759.png

负数乘法

  • 对于负数来说,直接将符号位当成一位数字去进行运算的话,最终结果是错误的
  • 计算方法
    • 方法一:先将复数转化为正数,按照上面说的方法运算,如果最后得到的也是复数,那么修改符号位即可
    • 方法二:booth算法

image-20211104232521663.png

例子

两正数

image-20211104232826990.png

一正一负

image-20211104232930126.png

手算(不会)

image-20211104232945679.png

Division

More complex than multiplication

image-20211104233046350.png

计算方法

主要思想:将被减数向左移位,然后减除数,如够减本位记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)

image-20211104233138791.png

例子

image-20211104233120863.png

负数除法

类似负数乘法,也有两种方式

  • 方法一:将数字转化为正数,然后按照上述方法计算,在结束后判断是否需要修改符号位
  • 方法二:如下

老师没讲,应该只是了解一下

image-20211104233815096.png

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+21+23=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 2k11
      • 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 2811=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

image-20211104235312263.png

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(231),其表示的数是
    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(231)×21111,11110111,1111=1.111....11(231)×2128=(2223)×2128

  • 最小值:即符号位和尾数全部为0,即 0   0000 , 0000   000...00 ( 23 个 0 ) 0\ 0000,0000\ 000...00(23个0) 0 0000,0000 000...00(230),其表示的数是:

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(230)×20000,00000111,1111=1.000....00(230)×2127=1×2127

image-20211105000631695.png

  • 对于32位的浮点数来说,其指数位有8位,可以表示的范围大概为 + / − 2 128 ≈ 3.4 × 1 0 38 +/- 2^{128} \approx 3.4\times10^{38} +/21283.4×1038
  • 精确度:大概为 2 − 23 = 1.2 × 1 0 − 7 2^{-23}=1.2\times10^{-7} 223=1.2×107

Density of Floating Point Numbers

image-20211105001437478.png

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×BXeYe+YS)×ByeXY=(XS×BXeYeYS)×ByeX×Y=(XS×YS)×BXeYeX/Y=(XS×YS)×BXeYe
对于加法和减法来说,向大数对其的意思是将其指数修改为和大数的指数位一样的值,将其尾数向右移动相同的位数

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} 255×290=2145<2127
  • 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
  • 对其有效位(调整指数)
    • 移动较小操作数的尾数
    • 一旦发生溢出对最后的结果影响比较小
  • 尾数加减
  • 规范化

image-20211105002336254.png

乘法与除法

步骤

  • Check for zero
  • 加/减指数
    • 记得要加或者减偏移
  • 乘/除尾数
  • 规范化
  • Round
  • 所有中间结果均应该存储在两倍大小长度的存储器中(保证精度)

image-20211105002535046.png

IEEE 754 Formats

image-20211105002601604.png

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: 符号位
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hydrion-Qlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值