第二章 数据的表示和运算
2.1 数制与编码
2.1.1 进位计数制及其相互转换
2.1.2 *BCD编码
2.1.3 定点数的编码表示
⚫️定点数 VS 浮点数
-
定点数:小数点的位置固定;常规计数法
-
浮点数:小数点的位置不固定;科学计数法
-
定点数的表示:无符号数、有符号数
-
通常用定点补码表示整数,定点原码表示小数,移码表示浮点数的阶码
⚫️无符号数的表示
- 通常只有无符号整数,而没有无符号小数
- 表示范围(8位二进制):28种状态,0000 0000~1111 1111,0~255
⚫️有符号数的表示(原码、反码、补码、移码)
-
定点整数:符号位+数值部分(尾数)+小数点位置(隐含)
-
定点整数:符号位+小数点位置(隐含)+数值部分(尾数)
-
可用原码、反码、补码三种方式来表示定点整数和定点小数,还可用移码表示定点整数
-
原码:用尾数表示真值的绝对值,符号位“0/1”对应“正/负”;真值0有+0和-0两种
-
反码:若为正数,则反码与原码相同;若为负数,则数值位全部取反;真值0有+0和-0两种
-
补码:若为正数,则补码与原码相同;若为负数,则为反码末位+1,即原码数值位取反+1(要考虑进位);真值0只有一种表现形式(0000 0000);定点整数补码1,000 0000表示-27,定点小数补码1.000 0000表示-1
(负数补码转原码方法相同,尾数取反,末位+1) -
移码:补码的基础上将符号位取反;移码只能用于表示整数;真值0只有一种表示形式1000 0000
⚫️原码、反码、补码、移码的作用
- 补码:让减法操作变为加法操作,ALU中无需集成减法器,节省硬件成本;执行加法操作时,符号位一起参与运算
- 移码:表示的整数很方便对比大小
2.1.4 整数的表示
- 无符号整数:可用无符号整数进行地址运算,或用它来表示指针
- 无符号小数:计算机中的带符号整数都用补码表示
2.2 运算方法和运算电路
2.2.1 基本运算部件
⚫️一位全加器
- 全加器(FA)是最基本的加法单元
(~P035 图3.5 一位全加器)
- 逻辑表达式
(~P035 和表达式;进位表达式)
⚫️串行进位加法器
- 只有一个全加器,数据逐位串行送入加法器中进行运算
- 进位触发器用来寄存进位信号,以便参与下一次运算
- (只能一位一位地加)
⚫️并行进位加法器
- 把n个全加器串接起来,就可以进行两个n位数的相加
- (可多位同时加)
⚫️算数逻辑单元ALU
- 作用:算数运算、逻辑运算、辅助功能(移位、求补等)
- 原理:ALU的核心是带标志加法器,同时也能执行“与”“或”“非”
- 加法器的设计(门电路组合)
(~P037 图2.7 ALU的基本结构 图2.8 一位ALU的结构)
- *奇偶校验码
2.2.2 定点数的移位运算
⚫️算数移位
- 原码(符号位不变,仅对数值位移位)
算数右移:除以基数的n次方;高位补0,可能丢失精读
算数左移:乘以基数对n次方;低位补0,可能出现严重误差" - 反码:正数同原码,负数补1
- 补码:正数同原码,负数补码中,最右边的1及其右边同原码,其余左边同反码(符号位不参与移位,左移补0,右移补1)
⚫️逻辑移位
- 逻辑右移:高位补0,地位舍弃
- 逻辑左移:地位补0,高位舍弃
- (可看作是“无符号数”动算数移位)
⚫️循环移位
- 适用于将数据的低字节数据和高字节数据互换
2.2.3 定点数的加减运算
⚫️补码的加减法运算
⚫️补码加减运算电路
- 加法X+Y:按位相加
- 减法X-Y:Y全部按位取反,末位+1,得到[-Y]补,减法变加法
- (无符号数的加法/减法也可用该电路实现,但判断溢出的方式不同)
(~P040 图2.10 补码加减运算部件)
⚫️溢出判别方法
- 溢出标志OF:溢出为1,否则置0(只对有符号数的加减)
OF=最高位产生的进位 异或 次高位产生的进位 - 符号标志SF:负为1,正为0(只对有符号数的加减)
SF=最高位的本位和 - 零标志ZF:=1结果为0,=0结果不为0
ZF看两个运算结果的n bit是否全为0 - 进位/借位标志CF:溢出为1,否则为0(只对无符号数的加减)
CF=最高位产生的进位 异或 sub(sub=1减法,sub=0加法)
2.2.4 定点数的乘除运算
⚫️乘法运算
- 实现思想:“累加—右移”,可分为原码一位乘法和补码一位乘法
原码一位乘法
(~课 2.2_6_1)
- 进行n轮加法、移位
- 每次加法可能+0、+[x]原,根据MQ的最低位
- 每次移位是“逻辑右移”
- ( 符号位异或运算; 小数和整数运算类似,仅小数点位置不同)
补码一位乘法
- 进行n轮加法、移位,最后再多来一次加法
- 每次移位是“补码的算数右移”
- 每次加法可能+0、+[x]补、+[-x]补,根据辅助位-MQ的最低位
- (被除数为双符号位补码;除数是单符号位补码,多一位辅助位;算数右移:正数00右移补0,负数11右移补1)
⚫️除法运算
- 实现思想:“累加—左移”(逻辑左移),分为原码除法和补码除法
原码除法(恢复余数法)
- 上商0/1,得到余数,余数末位补0(会先默认上商1,如果错误再商0,并恢复余数)
- (如果余数为负数1,说明应该上商0;若一步动余数为负,也需要恢复余数并商0)
原码除法(加减交替法/不恢复余数法)
- 若余数为负,可直接商0,并让余数左移1位再加上|除数|,得到下一个新余数
- 若余数为正,则商1,让余数左移一位再减去|除数|,得到下一个新余数
补码除法(加减交替法)
(~课 2.2_7_2)
- (符号位参与运算;被除数、余数、除数采用双符号位)
- 若被除数和除数同号,被除数减去除数;若为异号,被除数加上除数
- 若余数和除数同号,则商1,余数左移一位减去除数;若为异号,则商0,余数左移一位加上除数
- 重复上一步n次,精度无要求用“末位恒置1”法
2.2.5 C语言类型转换
- 有符号数和无符号数的转换:不改变数据内容,改变解释方式
- 长整数变短整数:高位截断,保留低位
2.2.6 数据的存储和排列
⚫️“大端模式”和“小端模式”
- 大端模式:便于人类阅读
- 小端模式:便于机器处理,从最低有效字节LSB到最高有效字节MSB的顺序存储
⚫️“边界对齐”
- 边界对齐:浪费了一些存储空间,但提高了取指令和取数的速度,访问一个字/半个字都只需一次访存
- 边界不对齐:可充分利用存储空间,但访问一个字/半个字可能需要两次访存
2.3 浮点数的表示与运算
2.3.1 浮点数的表示
⚫️浮点数的表示格式
- 数符:S 取值0或1
- 阶码:E 常用补码或移码表示的定点整数,阶码的底通常为2(反映浮点数的表示范围及小数点的实际位置)
- 尾数:M 常用原码或补码表示的定点小数(反映浮点数的精度)
⚫️*浮点数的表示范围
(~P061 图2.18 浮点数的表示范围)
⚫️浮点数的规格化
- 规格化:通过调整一个非规格化浮点数的尾数和阶码的大小,使非零的浮点数在尾数的最高位上保证是一个有效值
- 左规:尾数算数左移1位,阶码减1;进行多次,直到尾数最高位是有效值
- 右规:当浮点数运算结果尾数出现溢出(双符号位为01或10时;此处采用“双符号位”,当发生溢出时可以挽救);尾数算数右移1位,阶码加1;只需要进行一次
- 原码表示尾数的规格化:正数0.1…形式,负数1.1…形式
- 补码表示尾数的规格化:正数0.1…形式,负数1.0…形式
- (补码规格化时,算数左移,低位补0;算数右移,高位补1)"
⚫️IEEE754标准
-
阶码:E 用移码表示,令偏置值=127D=0111 1111B(阶码1111 1111(-128)、0000 0000(-127)用做特殊用途,正常范围-126~127)
-
尾数:M 用原码表示,隐藏表示最高位1,尾数真值为1.M
-
IEEE754标准规定常用浮点数格式有:短浮点数(单精度、float型)、长浮点数(双精度、double型)、临时浮点数
-
短浮点数的真值为:(-1)Sx1.Mx2E-127
-
长浮点数的真值为:(-1)Sx1.Mx2E-1023
(~P062 表2.4 IEEE754浮点数的格式)
⚫️定点、浮点表示的区别
- 数值的表示范围:浮点数>定点
- 精读:浮点数<定点
- 数的运算:浮点数包括阶码和尾数的运算,并需规格化
- 溢出问题:浮点数只有规格化后,阶码超出,才发生溢出
2.3.2 浮点数的加减运算
⚫️运算步骤(5步)
- 对阶:以小阶向大阶看起,尾数算数右移
- 尾数加减
- 规格化:左规/右规
- 舍入:0舍1入、恒置1法、截断法
- 判溢出:阶码超过两位,发生溢出