计算机组成原理

陈付龙,孙道清,沈展,徐晟,罗乐,陈士县,周武

目录

  • 1 前言
    • 1.1 课程简介
    • 1.2 说课
    • 1.3 预备学习
  • 2 计算机系统概论
    • 2.1 计算机的发展历程
    • 2.2 计算机系统的基本组成
    • 2.3 计算机系统的层次结构
    • 2.4 程序开发与执行过程
    • 2.5 计算机系统性能评价
    • 2.6 本章小结
  • 3 数据的机器级表示
    • 3.1 数制和编码
    • 3.2 定点数的表示
    • 3.3 浮点数的表示
    • 3.4 十进制数的表示
    • 3.5 非数值数据的编码表示
    • 3.6 数据的宽度和存储
    • 3.7 数据的校验码
    • 3.8 本章小结
  • 4 运算方法和运算部件
    • 4.1 高级语言和机器指令中的运算
    • 4.2 基本运算部件
    • 4.3 定点数运算
    • 4.4 浮点数运算
    • 4.5 运算部件的组成
  • 5 存储器分层体系结构
    • 5.1 存储器概述和RAM芯片
    • 5.2 主存与CPU的连接及其读写操作
    • 5.3 高速缓冲存储器
    • 5.4 虚拟存储器
    • 5.5 本章小结
  • 6 指令系统
    • 6.1 指令格式设计
    • 6.2 指令系统设计
    • 6.3 指令系统实例
    • 6.4 程序的指令集表示
    • 6.5 本章小结
  • 7 中央处理器
    • 7.1 CPU概述
    • 7.2 单周期处理器设计
    • 7.3 多周期处理器设计
    • 7.4 微程序控制器设计
    • 7.5 异常和中断处理
    • 7.6 本章小结
  • 8 指令流水线
    • 8.1 指令流水线概述
    • 8.2 流水线数据通路和控制逻辑
    • 8.3 流水线冒险及其处理
    • 8.4 高级流水线技术
    • 8.5 本章小结
  • 9 互连及输入 输出组织
    • 9.1 外设概述
    • 9.2 外设与CPU、主存的互连
    • 9.3 I/O接口
    • 9.4 I/O数据传送方式
    • 9.5 I/O子系统
    • 9.6 本章小结
  • 10 复习
    • 10.1 知识要点
    • 10.2 2013年试卷
    • 10.3 2014年试卷
    • 10.4 2015年试卷
    • 10.5 2016年试卷
    • 10.6 2017年试卷
    • 10.7 2018年试卷
    • 10.8 2019年试卷
    • 10.9 2020年考试
    • 10.10 2021年试卷
    • 10.11 2022年试卷
    • 10.12 2023年试卷
    • 10.13 2024年试卷
  • 11 实验
    • 11.1 实验一:Xilinx Nexys4开发板使用(选做)
    • 11.2 实验二:数据的机器级表示
    • 11.3 实验三:定点加减法实现
    • 11.4 实验四:定点乘除法实现(选做)
    • 11.5 实验五:逻辑运算与移位运算(选做)
    • 11.6 实验六:ALU设计
    • 11.7 实验七:浮点加减法(选做)
    • 11.8 实验八:浮点乘法和除法(选做)
    • 11.9 实验九:浮点运算单元(选做)
    • 11.10 实验十:寄存器设计
    • 11.11 实验十一:RAM和ROM设计
    • 11.12 实验十二:Cache设计 (选做)
    • 11.13 实验十三:MIPS汇编程序调试
    • 11.14 实验十四:单周期MIPS微处理器设计
    • 11.15 实验十五:简单多周期MIPS微处理器设计(选做)
    • 11.16 实验十六:复杂多周期MIPS微处理器设计(选做)
    • 11.17 实验十七:流水线MIPS微处理器设计(选做)
浮点数的表示

IEEE 754标准解读

简介

IEEE 754 标准 是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号,它规定了浮点数在计算机当中的存储方式以及算术标准等。

存储方式

计算机中数据均是按二进制的方式存储的,浮点数的存储也是如此。但是由于浮点数的特殊性,无法采用整数的补码存储方式,浮点数需要有特定的存储方式。总的来说,一个浮点数可以分为3部分存储:

  • sign(符号)

  • exponent(指数)

  • fraction(尾数)

举例:0.00101(2)=1.01×2−30.00101(2)=1.01×2−3 
(2)表示二进制,上式中小数0.00101可以存储为3部分 
①sign: + 
②exponent: (-3) 
③fraction: 01 
为什么不存储小数点前面的数呢? 
key:浮点数之所以叫浮点数,是因为小数点的位置是不确定的。 
如上面的0.00101(2)0.00101(2) 可以写成1.01×2−31.01×2−3 ,也可以写成10.1×2−410.1×2−4 ,而如果这台机器这样存,那台机器那样存,这可怎么计算呢? 
因此,存储是统一化成科学记数法,即小数点之前一定是1。 
化成科学记数法之后最高位均为1,于是便将1省略,只存储小数点之后的尾数,这种机制使同样的内存空间可以存储更大范围的数。

单精度和双精度所占字节数不一样,他们②③部分的宽度自然不一样(如图分别为float和double) 
float 
double 
sign 
符号位在计算机中的存储是非常容易的,因为符号只有正负两种情况,因此需一个bit便可存储,0代表正,1代表负

exponent 
指数是一个整数,一般来说整数会采用补码存储,但是补码存储不能方便地进行浮点数的比较以及运算(原因参见wikipedia )

于是exponent采用biased exponent = exponent + bias 
实际计算机中存储的是经过偏移的指数(biased exponent),即在原来指数的基础上加上一个数(float是加上127,double是1023),这个经过偏移的指数一定非负。 
举例:单精度浮点数,指数为-3,偏移过后为124,于是便存储为01111100

fraction 
直接将fraction转化为二进制后存入计算机

规约与非规约(normalized & denormalized numbers)

我们先来计算按如此方式存储所能表示的最小的正数和最大的负数 
±1.0 × 2^minexp 
即fraction部分以及exponent部分均为最小,1是隐藏存储的,但是可不可以更小呢? 
为了满足对精度的需求,使能表示的数更加地接近0,IEEE754标准引入了规约(normalized)与非规约(denormalized)的概念。

normalized number 
标准规定规约型的浮点数,最高位隐藏存储为1,偏移后的指数b_exp范围为

0<b_exp<2^e - 1

. e指的是exponent部分的宽度。例如float指数宽度为8,能表示的最小指数为0-127 = -127。fraction部分直接存储

denormalized number 
规定非规约的浮点数,最高位隐藏存储0,偏移后的指数b_exp为0,fraction部分直接存储(但是不能为0,原因往下看)。 
你也许会想既然规约和非规约都是隐藏存储最高位,那么计算机怎么知道隐藏的是1还是0呢?这个很简单,注意规约和非规约的b_exp范围是有区别的,计算机会根据这个进行判断。

特殊值

标准规定了一些特殊值(零,无穷,非数字)的存储方式 
如果 指数 是0 并且 小数部分 是0, 这个数±0 (和符号位相关,这就是上文说的原因) 
如果 指数 = 2^e - 1并且 小数部分 是0, 这个数是 ±无穷大 (同样和符号位相关) 
如果 指数 = 2^e - 1并且 小数部分 非0, 这个数表示为不是一个数(NaN).

总结一下,列个表

formbiased exponentfraction
zero00
denormalized0not 0
normalized
0<b_exp<2^e - 1

±infinity (±∞)2^e - 10
NaN2^e - 1not 0

参考资料:百度百科、Wikipedia

精确存储

浮点数存在不精确存储的现象 
这种现象发生于一下几种情况之下:

  • 有效位数过长

  • 无法表示某些数

第一种很容易理解,以double类型为例,存储位数只有52(如果加上省略的那位是53位),如果存储的数有效位数大于53,则无法准确存储 
第二种情况,举个例子吧,0.3就不能化成二进制

扩展阅读

IEEE 754 - Standard binary arithmetic float

http://www.softelectro.ru/ieee754_en.html

https://ieeexplore.ieee.org/document/4610935