计组第二章:运算方法和运算器
2.1 数据信息的表示
数据
- 数值数据
- 有量的概念
- 非数值数据
数据在计算机中用二进制表示
2.1.1 数值数据的表示
在计算机系统中,十进制数作为人机交互的媒介,数据则以二进制数的形式存储和计算
二进制
- 易于物理实现
- 运算规则简单
- 机器可靠性高
- 逻辑判断方便
进位计数制
- 从低位向高位进位的方式进行计数的数据表示方法
两个概念:
基数
- 每个数位所用到的数码符号的个数
权
- 数码在不同的数位上所表示的数值是不同的
- 每个数码所表示的数值等于该数码本身乘以一个与它所在数位有关的常数, 这个常数叫做权
十进制
- 基数为10,逢10进1
- 一个数的数值大小就是它的各位数码按权相加之和
- 任何一个十进制数都可以用一个多项式来表示
二进制
- 基数为2,逢2进1
- 任意数位的权是2i
十六进制
- 基数为16,逢16进1
- 0~F
后缀字母
- B:二进制数
- H:十六进制数
- D:十进制数,可省略
进制转换
- 二-十六
- 四位一组
- 二-十
- 按权展开相加法
- 十-二
- 基数乘除法
- 整数部分用除基取余法
- 除2,先得到的余数为低位
- 小数部分用乘基取整法
- 乘2,先得到的整数为高位
- 整数部分用除基取余法
- 基数乘除法
符号位
- 把正负符号用1位二进制数码来表示
机器数(或机器码)
-
把符号位和数值位一起编码来表示的数。
-
“0”表示正号,“1”表示负号,符号位置于最高数值位之前
-
表示形式包括原码、补码、反码、移码
真值
- 用“+”、“-”来表示符号的数
原码
- 符号位为0表示正数,为1表示负数,数值部分用二进制数的绝对值表示
补码
- 把某数X加上模数K,称为以K为模的X的补码
- 正数:0(符号位)+本身(数值位)
- 负数:1(符号位)+取反加一(数值位)
- 0的补码是0
原码和补码互变都是取反加一
反码
- 引入反码的目的是便于求负数的补码
- 正数的反码与原码相同
- 负数的反码是符号位不 变,数值位逐位取反
- 0的反码
- [+0]反=00000000
- [-0]反=11111111
采用补码运算,计算机的控制线路较为简单
- 所以,目前大多数计算机均采用补码存储、补码运算
- 其运算结果仍为补码形式
在n位机中,用n位二进制数补码表示一个带符号的整数时,最高位为符号位,后面n-1位为数值部分
移码
- 移码也称为增码或偏码,常用于表示浮点数中的阶码
- 移码可由补码求得,只要把补码的符号位取反就得到了移码
数据表示格式
- 定点
- 浮点
定点数
- 一个数中小数点的位置是固定的
- 可表示的数值范围有限
- 要求的处理硬件简单
定点格式
- 小数点位置固定不变
- 通常将定点数据表示成纯小数或纯整数
- 为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前
- 为了把数表示成纯整数,则把小数点固定在数值部分的最后面
浮点数
- 一个数中小数点的位置是浮动的
- 可表示的数值范围很大
- 要求的处理硬件复杂
科学计数法
- 把数据表示成一个小数乘以一个以10为底的指数
浮点表示法
- 把一个数的有效数字(精度)和数的范围在计 算机中分别表示
- 相当于数的小数点位置随比例因子的不同而在一定范围内自由浮动
- 改变指数部分的数值相当于改变小数点的位置
- R进制
- N = Re x M
- e为阶码,浮点数的指数
- M为尾数,是纯小数
- N = Re x M
- [S(符号位x1位)] [E(阶码xm位)] [M(尾数xn位)]
- 规范化
- 当尾数的值不为0时,尾数域的最高有效位应为1
- 否则就要用修改阶码同时左右移动小数点的办法,使其变成符合这一要求的表示形式
- IEEE标准
- 三元组{S,E,M}
- 基数为2
- 符号位S用0和1表示正负
- 尾数M用原码表示
- 阶码E用移码表示
- 单精度
- S1位
- E8位
- M23位
- 双精度
- S1位
- E11位
- M52位
- 规定尾数域最高有效位为1,且这一位不予存储
机器零
- 如果一个浮点数尾数为0或者其阶码的值遇到比它所能表示的最小值还小时,计算机都将这个浮点数看作零值。
为啥指数偏移量不选128
- 因为128要当无穷用,具体见PPT62页
阶码算指数,虽然阶码使用移码存的,但是偏移量是127,所以得先十进制数,然后减127。
字符串形式
- 一个字节存放一个十进制的数位或符号位
- 一个十进制数占用连续的多个字节
- 为了明确表示一个字符串,需要给出该数在主存中的起始地址和位数(串的长度)
- 主要用在非数值计算的应用领域中
压缩的十进制数串形式
- 一个字节存放两个十进制的数位
- 一个数连续占用主存的多个字节
- 每个数位占用4个二进制位
- 要指明一个压缩的十进制数串,必须给出它在主存中的首地 址和数字位个数(又称位长,不含符号位)
- 位长为0的数其值为0
2.1.2 非数值数据的表示
字符与字符串的表示
非数值数据
- 通常指的是字符、字符串、图形符号、汉字等数据
- 不用来表示数值的大小,一般也不进行算术运算
ASCII字符
- 用7位二进制编码(0~127)表示一 个字符,总共可以表示128个字符
- 有95个是可显示和打印的字符,包括10个十进制数字(0~9)、52个英文大写和小写字母( A ~ Z,a ~ z)、以及若干个运算符和标点符号
- 除此之外的33个字符是不可显示和打印的控制符号,原先用于控制计算机外围设备的某些工作特性,现在多数已被废弃
- 计算机通常用一个字节(8位)来存放一个ASCII字符
- 字节的低7位表示不同的ASCII字符
- 字节的最高1位固定为0
Unicode
- UCS-2
- 每个字符占用2个字节
- 使用16位的编码空间,理论上允许表示 216=65 536个字符,可以基本满足各种语言的使用需要
- UCS-4
- 每个字符占用4个字节 (实际上只用了31位,最高位必 须为0)
- 理论上可以表示231=2 147 483 648个字符
字符串
- 连续的一串字符
- 通常占用主存中连续的多个字节,每个字节存放一个字符(以ASCII字符为例)
汉字的编码方式
输入码
- 数字码
- 将待编码的汉字集以一定的规则排序以后,依次逐个赋予相应的数字串,以此作为汉字输入码
- 区位码和电报码是典型的数字码,用4个数字对一个汉字进行编码
- 优点是无重码,致命缺点是代码难以记忆
- 拼音码
- 简单易学
- 字形码
- 以汉字的形状为基础而确定的编码
- 码长较短,重码率低,输入速度快
- 混合码
- 以音为主,以形为辅,音形结合,取长补短
直接从键盘输入的各种汉字输入方法的编码,属于机外码,简称外码
交换码
- 也称为汉字国标码,主要用于汉字信息处理系统或通信系统之间的信息交换
GB2312
- 一个汉字所在位置的区号和位号组合在一起就构成一个4 位数的代码
- 前两位数字为“区码”(01~94),独占一个字节
- 后两位数字为“位码”,也独占一个字节
- 这种代码称为“区位码”
国标码与区位码的关系如下所示:
- 国标码高位 = 区码+20H
- 国标码低位 = 位码+20H
内码
- 计算机内部对汉字信息进行各种加工、处理所使用的编码
- 汉字可以通过不同的输入码输入,但在计算机内部其内码是惟一的
- 一个汉字的机内码一般用两个字节表示
机内码与区位码、国标码的关系
- 机内码高位 = 国标码高位+80H = (区码+20H)+80H = 区码+A0H
- 机内码低位 = 国标码低位+80H = (位码+20H)+80H = 位码+A0H
字形输出码与汉字库
汉字字形码
- 为了能显示和打印汉字,必须先存储汉字的字形
- 汉字字形码在存储器中与其存储地址是一一对应的
点阵字库
-
每个汉字字符包含m列n行,用一个由m×n个像素组成的 位图表示,定义成一个被称为字模(Mask)的m×n点阵
-
可分为低分辨率(16x16 24x24 32x32)和高分辨率(>= 64x64)两大类
-
复原字形速度快,但缩放后的字形质量难以保证,字体放大后可能出现边缘锯齿或笔画损失 ,影响字体的美观
矢量字库
- 存储不同字体文字的外部形态的矢量信息
- 保存的是对每一个汉字的描述信息
- 汉字字形是通过数学曲线来描述的
- 字体可以无限放大而不产生变形
汉字编码的发展
- GB2312字符集
- BIG5字符集
- 又称大五码
- GBK字符集
- GB18030字符集
2.1.3 数据信息的校验
奇偶校验的概念
- 是一种最简单且应用广泛的数据校验码
- 硬件成本很低
- 可以检测出一位或奇数位错误,但不能确定出错位置,也不能检测出偶数位错误
实现方法
- 由若干位有效信息(如1个字节)再加上1位校验位组成校验码
- 奇校验:当有效信息位中“1”的个数为奇数时,奇校验位为0,否则为1
- 偶校验:当有效信息位中“1”的个数为偶数时,偶校验位为0,否则为1
简单奇偶校验
校验位形成
- 奇偶校验码的编码和校验由专门逻辑电路实现
- 奇校验位(奇形成) = 非(D7⊕D6⊕D5⊕D4⊕D3⊕D2⊕D1⊕D0)
- 偶校验位(偶形成) = D7⊕D6⊕D5⊕D4⊕D3⊕D2⊕D1⊕D0
- ⊕表示异或
- 若D7~D0中有奇数个“1”,则奇校验位=0,偶校验位=1
- 若D7~D0中有偶数个“1”,则奇校验位=1,偶校验位=0
校验测试
- 读出数据时,将读出的9位代码(8位信息位和1位 校验位)同时送入奇偶校验电路进行检测
- 奇校验出错 = D7⊕D6⊕D5⊕D4⊕D3⊕D2⊕D1⊕D0⊕D奇
- 偶校验出错 = D7⊕D6⊕D5⊕D4⊕D3⊕D2⊕D1⊕D0⊕D偶
- 若读出代码无错误,则“奇校验出错”/“偶校验出错 ”=0
- 若读出代码出现错误,则“奇校验出错”/“偶校验出错 ”=1
- 从而指示这个9位代码中一定有某一位出现了错误,但具体的错误位置无法确定
交叉奇偶校验
- 纵向、横向同时校验的方法
- 计算机在进行大量字节(数据块)传送时,不仅每个字节有一个奇偶校验位做横向校验,而且全部字节的同一位也设置一个奇偶校验位做纵向校验
2.2 定点运算和浮点运算器
基本运算
- 算术运算
- 四则运算
- 定点数和浮点数
- 逻辑运算
- 与或非异或
- 不带符号的二进制数
2.2.1 定点加、减法运算
现代计算机的运算器一般都采用补码形式进行加减法运算
补码加法
- [x]补+[y]补=[x+y]补(mod 2)
- 在模2意义下,任意两数的补码之和等于该两数之和的补码——这是补码加法的理论基础
- 模2的意思是丢弃进位
补码减法
- **[x-y]补=[x+(-y)]补=[x]补+[-y]补(mod 2) **
- 减去一个数就是加上这个数的负数
- 求[-y]补
- 将[y]补连同符号位“取反且最低位加1”
溢出
- 两数进行加减运算之后的运算结果超出了给定的取值范围
- 正溢
- 两个正数相加,结果大于机器所能表示的最大正数
- 负溢
- 两个负数相加,结果小于机器所能表示的最小负数
- 判定方法
- 单符号位法
- 双符号位法
- 用两个符号位表示一个数据
- 00表示正数
- 11表示负数
- 如果两个数相加后,其结果的两个符号位一致(00 或11),则没有发生溢出
- 如果两个符号位不一致(10或01),则发生溢出
- 两个符号位为01时为正溢
- 两个符号位为10时为负溢
- 用两个符号位表示一个数据
2.2.2 定点乘、除法运算
方式
- 实现角度
- 采用软件实现乘除法运算
- 循环子程序等
- 最简单,速度最慢
- 采用硬件实现乘除法运算
- 逻辑电路
- 移位、计数器
- 逻辑电路
- 并行乘除法器
- 流水式阵列乘法器
- 速度最快
- 采用软件实现乘除法运算
- 编码角度
- 补码
2.2.3 逻辑运算
逻辑数
- 参加逻辑运算的数据
- 是不带符号位的二进制数
非
- 取反
- “-”
与
- 全1为1,否则为0
- 可用于对一个数据的某几位清0
- “^”或"."
或
- 有1为1,全0为0
- 可用于对一个数据的某几位置1
- “ ∨ ”或“+”
异或(XOR)
- 同0异1
- 可用于对一个数据的某几位取反(异或上1)
- 对一个数连续两次异或恢复原来的状态
- “ ⊕ ”
2.2.4 定点运算器的组成
运算器
- 是数据的加工处理部件,是CPU的重要组成部分
- 主要功能是对数据进行加工处理
- 算术运算
- 逻辑运算
- 组成
- 算术逻辑单元(ALU)
- 寄存器
- 数据总线
- 基本结构
- 能实现算术和逻辑运算的功能部件ALU
- 存放待加工信息或加工后信息的通用寄存器组
- 按操作要求控制数据输入的部件
- 按操作要求控制数据输出的部件
- 计算机与其他部件进行信息传输的总线,以及总线接 收器和发送器
算术逻辑单元(ALU)
- 是具体完成算术与逻辑运算的单元,是运算器的核心,由加法器及其他逻辑运算单元组成
- 加减乘除、布尔运算(逻辑运算),比较数值
- 任何计算机都可以通过编程来执行任何算术运算
- 超标量(Superscalar)计算机包含多个ALU,可以同时处理多条指令
- 图形处理器和具有单指令流多数据流SIMD和多指令流多数据流MIMD特性的计算机,通常提供可以 执行矢量和矩阵算术运算的ALU
数据总线
- 为了减少运算器内部的数据传送线同时便于控制,通常将一些寄存器之间的数据传送通路加以归并,组成总线结构,使不同来源的信息在此总线上分时传送
- 用于完成运算器内部的数据传送的结构
- 按位置分
- 内部总线
- 是指CPU内各部件的连线
- 外部总线
- 指系统总线,即CPU与存储器、I/O 系统之间的连线
- 内部总线
- 按逻辑结构分
- 单项传送总线
- 信息只能向一个方向传送
- 传送地址信息或控制信息
- 双向传送总线
- 信息可以向两个方向传送
- 数据总线
- 单项传送总线
运算器的基本结构形式
-
运算器的设计,主要是围绕ALU和寄存器同数据总线之间如何传送操作数和运算结果来进行的
-
单总线结构
- 所有部件都连接到同一条总线上
- 运算器内部只有一组数据总线
- 优点是总线的控制电路比较简单,有利于提高大规模集成电路的集成度
- 缺点是操作速度较慢,同一时间内只能有一个操作数放到总线上
-
双总线结构
- 两条总线同时连接ALU的两个输入端
- 两操作数一起传入,然后结果存到缓存中去
-
三总线结构
- 两操作数一起传入,再从第三条总线传出结果
- 为了避免寄存器之间的数据传送也要用到ALU 从而降低速度,在三总线结构运算器中还专门设置了总线旁路器
寄存器
- 一般指的是通用寄存器
- 通用寄存器是指这些寄存器的用途广泛
- 除了通用寄存器外,还有一些专用寄存器
- 累加器
- 是运算器中与ALU直接相连、使用频繁的一种寄存器
- 每次运算的操作数或运算的中间结果大多存放在累加器中
2.3 浮点运算和浮点运算器
浮点数规格化
- 可以使浮点数保留最多的有效数字
- 可以使数据具有惟一的表示形式
浮点数加减法
步骤
- 0操作数检查
- 如果能判断 出两个操作数中有一个为0,那么运算结果 马上可知,而不必进行后续的一系列操作
- 对阶
- 看小数点位置是否对齐
- 同:运算
- 不同:对阶(使两数的阶码相同)后运算
- 一般尾数右移,使之只丢失小数位
- 小阶向大阶靠拢 的原则
- 看小数点位置是否对齐
- 尾数相加
- 结果规格化
- 两个符号位数据不相等
- 向右规格化
- 尾数右移1位,阶码加1
- 向右规格化
- 符号位与数据最高位相等
- 向左规格化
- 尾数左移n位,阶码相应减n
- 向左规格化
- 两个符号位数据不相等
- 舍入处理
- 0舍1入
- 尾数右移时被丢掉的数据的最高位
- 如果是0 ,那就舍去;
- 如果是1,就在尾数的最低位 加上“1”
- 误差小
- 可能需要向右规格化
- 尾数右移时被丢掉的数据的最高位
- 恒置1
- 尾数右移时,只要发生低位数据的丢失, 尾数的最低位就被设定为1
- 舍入处理时无需进行加法运算 ,所以速度快,也不会需要再次“向右规格化”
- 0舍1入
- 溢出处理
- 尾数溢出
- 向右规格化
- 阶码溢出
- 如果阶码减去n发生溢出,也就是发生阶码的下溢
- 机器一般认为运算结果就是0
- 如果阶码加上1发生阶码溢出,也就是发生阶码的上溢
- 一般认为是+∞或-∞
- 机器的溢出标志会被置“1”
- 如果阶码减去n发生溢出,也就是发生阶码的下溢
- 浮点数运算真正的溢出
- 是指在尾数相加的时候发生尾数上溢,并在向右规格化的时候使阶码也发生上溢
- 尾数溢出
浮点数乘除法
- 乘积:阶码相加,尾数相乘
- 除法:阶码相减,尾数相除
步骤
- 0操作数检查
- 阶码加减操作
- 尾数乘除操作
- 规格化处理与舍入
流水线原理
- 在完成第一条指令的前三步(取指、译指、取操作数)后,指令控制器不等运算器完成第一条指令的后两步(运算、写结果),就立即开始第二条指令的操作。对于运算器也是如此。形成一种与工厂中的装配流水线类似的流水线
- 把输入的任务分割为一系列子任务,各子任务能在流水线各个阶段并发执行
- 将任务连续不断地输入流水线,实现子任务级的并行
浮点运算器实例
- CPU之外的浮点运算器
- CPU之内的浮点运算器