第二章 数据的表示和运算
2.1 数制与编码
2.1.1 进位计数制
考点1:进制
| 进制 | 数码 | 基数 | 位权 |
| 二进制 | 0,1 | 2 | $2^k$ |
| 八进制 | 0,1,3,4,5,6,7 | 8 | $8^k$ |
| 十进制 | 0,1,3,4,5,6,7,8,9 | 10 | $10^k$ |
| 十六进制 | 0,1,3,4,5,6,7,8,9,A,B,C,D,E,F | 16 | $16^k$ |
考点2:进制的转换
| 转换 | 技巧 | 例题 |
| 其他进制 → 十进制 | 按权展开 | $(1011.01)_2$、$(735)_8$、$(2A3)_{16}$ 转十进制 |
| 十进制 → 其他进制 | 整数部分除基取余倒序,小数部分乘基取整正序 | $(13.6875)_{10}$ 转二进制、$(156)_{10}$ 转八进制、$(254)_{10}$ 转十六进制 |
| 二进制 → 八进制 | 整数部分从右向左每三位一组,小数部分从左向右每三位一组 | $(1011010.1101)_2$ 转八进制 |
| 八进制 → 二进制 | 每位数字展开成三位二进制 | $(275)_8$ 转二进制 |
| 二进制 → 十六进制 | 整数部分从右向左每四位一组,小数部分从左向右每四位一组 | $(11010110)_2$ 转十六进制 |
| 十六进制 → 二进制 | 每位数字展开成四位二进制 | $(3F)_{16}$ 转二进制 |
| 八进制 ↔ 十六进制 | 先转二进制,再转目标进制 | $(17)_8$ 转十六进制 |
2.1.2 真值与机器数
2.1.3 原码、反码、补码、移码
| 码制 | 运算规则 | 正数例子(+5) | 负数例子(-5) | +0 | -0 | 0-0 |
| 原码 | 符号位0正1负,数值部分不变;符号位参与运算 | 00000101 | 10000101 | 00000000 | 10000000 | 10000000 |
| 反码 | 正数同原码;负数符号位不变,其余位按位取反 | 00000101 | 11111010 | 00000000 | 11111111 | 11111111 |
| 补码 | 正数同原码;负数 = 反码 + 1;符号位参与运算 | 00000101 | 11111011 | 00000000 | 00000000 | 00000000 |
| 移码 | 补码符号位取反(常用于表示浮点阶码) | 10000101 | 01111011 | 10000000 | 10000000 | 10000000 |
<编辑定位>
2.2 定点数的运算
2.2.1 定点数的加法与减法
补码加减法是计算机中最基本的运算。
补码加法公式: [X + Y]补 = [X]补 + [Y]补 (mod 2^(n+1))
补码减法公式: [X - Y]补 = [X]补 + [-Y]补 = [X]补 - [Y]补 (mod 2^(n+1))
溢出判断: 当运算结果超出表示范围时发生溢出。判断溢出的方法:
1. 单符号位法:
- 正加正得负,或负加负得正,则溢出
- 即:符号位的进位 ⊕ 最高数值位的进位 = 1 时溢出
2. 双符号位法(变形补码):
- 使用两位符号位,00表示正,11表示负
- 结果符号位为01表示正溢出,为10表示负溢出
3. 数值比较法:
- 两个同号数相加,若结果的符号与操作数不同,则溢出
例题: 设机器字长为8位(含1位符号位),X = +0.1011,Y = -0.0101,求X+Y和X-Y。
解: [X]原 = 0.1011000,[X]补 = 0.1011000 [Y]原 = 1.0101000,[Y]补 = 1.1011000 [-Y]补 = 0.0101000
X + Y:
0.1011000
+ 1.1011000
10.0110000(舍弃进位) = 0.0110000
X - Y:
0.1011000
+ 0.0101000
0.1110000
结果:X + Y = +0.0110,X - Y = +0.1110
2.2.2 定点数的乘法运算
原码一位乘法 原码乘法的符号和数值部分分开运算: - 符号位:两数符号位异或 - 数值部分:绝对值相乘
算法步骤: 1. 被乘数取绝对值,乘数取绝对值 2. 根据乘数的末位决定是否加被乘数 3. 部分积和乘数一起右移一位 4. 重复n次(n为数值位数)
补码一位乘法(Booth算法) Booth算法可以直接处理补码表示的数,不需要取绝对值。
算法规则(根据乘数的末两位判断): - 00或11:部分积右移一位 - 01:部分积加被乘数后右移一位 - 10:部分积减被乘数后右移一位
Booth算法的优点: - 统一了原码和补码的乘法运算 - 可以处理任意符号的数 - 对连续的0或1有加速效果
2.2.3 定点数的除法运算
原码恢复余数法 除法运算需要比较被除数(余数)和除数的大小,如果够减则商1,不够减则商0并恢复余数。
算法步骤: 1. 符号位单独处理(异或) 2. 被除数和除数取绝对值 3. 被除数减去除数,若余数为正则商1,否则商0并恢复余数 4. 余数左移一位,重复上述过程
原码不恢复余数法(加减交替法) 恢复余数法需要回退,效率较低。不恢复余数法改进了这一过程: - 当余数为负时,不恢复余数,而是继续左移并加上除数 - 当余数为正时,左移后减去除数
补码除法 补码除法需要考虑被除数和除数的符号,判断“够减”的条件更复杂。常用方法有: - 补码交替除法 - 阵列除法器
2.3 浮点数的表示与运算
2.3.1 浮点数的表示格式
浮点数用于表示范围很大的数,采用科学计数法的形式:N = M × R^E
其中: - M为尾数(mantissa),表示数的有效数字 - E为阶码(exponent),表示小数点的位置 - R为基数,通常为2
IEEE 754标准格式 IEEE 754是浮点数表示的国际标准,规定了单精度和双精度两种格式:
单精度(32位): - 符号位S:1位,0为正,1为负 - 阶码E:8位,移码表示,偏移量为127 - 尾数M:23位,隐含最高位1(规格化数)
双精度(64位): - 符号位S:1位 - 阶码E:11位,偏移量为1023 - 尾数M:52位
数值计算公式: - 规格化数:(-1)^S × 1.M × 2^(E-偏移量) - 非规格化数:(-1)^S × 0.M × 2^(1-偏移量)
特殊值的表示:
| 阶码 | 尾数 | 含义 |
| —— | —— | —— |
| 全0 | 全0 | ±0 |
| 全0 | 非0 | 非规格化数 |
| 全1 | 全0 | ±∞ |
| 全1 | 非0 | NaN(非数) |
2.3.2 浮点数的规格化
规格化的目的 - 保证表示的唯一性 - 提高精度(充分利用尾数的位数)
规格化形式 对于二进制浮点数,规格化要求尾数的最高位为1(非规格化数除外)。
规格化判断: - 原码:符号位后第一位必须是1 - 补码:符号位与第一位必须不同(对于正数第一位为1,负数第一位为0)
规格化操作 左规:当尾数过小(非规格化)时,尾数左移,阶码减小 右规:当尾数溢出时,尾数右移,阶码增大
2.3.3 浮点数的运算
浮点数加减法步骤:
1. 对阶:使两个数的阶码相同,小阶向大阶看齐
- 计算阶差ΔE = E₁ - E₂
- 若ΔE > 0,则M₂右移ΔE位,E₂ = E₁
- 若ΔE < 0,则M₁右移|ΔE|位,E₁ = E₂
2. 尾数运算:对阶后的尾数进行加减运算
3. 规格化:运算结果可能非规格化,需要进行规格化处理
- 左规:尾数左移,阶码减1(直到规格化)
- 右规:尾数右移,阶码加1(当尾数溢出时)
4. 舍入:尾数右移时可能丢失低位,需要按一定规则舍入
- 截断法:直接丢弃多余位
- 舍入法:0舍1入
- 恒置1法:最低位置1
5. 溢出判断:阶码是否超出表示范围
- 阶码上溢:结果太大,产生溢出错误
- 阶码下溢:结果太小,当作0处理
浮点数乘除法
乘法: - 阶码相加 - 尾数相乘 - 结果规格化和舍入
除法: - 阶码相减 - 尾数相除 - 结果规格化和舍入
2.4 算术逻辑单元(ALU)
2.4.1 ALU的功能与结构
算术逻辑单元(ALU)是运算器的核心部件,负责执行算术运算和逻辑运算。
ALU的功能: - 算术运算:加法、减法、乘法、除法 - 逻辑运算:与、或、非、异或 - 移位运算:算术移位、逻辑移位、循环移位 - 比较运算:等于、大于、小于等
ALU的结构: ALU主要由以下部分组成: - 加法器:核心运算部件,用于实现加减法 - 逻辑运算电路:与门、或门、非门等 - 移位器:实现各种移位操作 - 标志寄存器:保存运算结果的状态信息
2.4.2 加法器电路
半加器 半加器实现两个一位二进制数的加法,不考虑低位进位。
真值表:
| A | B | 和S | 进位C |
| — | — | —– | ——- |
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
逻辑表达式:S = A⊕B,C = AB
全加器 全加器实现两个一位二进制数加上低位进位的加法。
逻辑表达式: S = A⊕B⊕Cᵢₙ Cₒᵤₜ = AB + (A⊕B)Cᵢₙ
串行加法器 使用一个全加器,逐位进行加法运算。速度慢,但硬件成本低。
并行加法器(行波进位加法器) 使用多个全加器并联,同时计算各位的和,但进位串行传递。
延迟时间:t = n × t_FA(n为位数,t_FA为全加器延迟)
先行进位加法器(CLA) 通过逻辑电路提前计算进位,避免进位逐级传递。
进位生成信号:Gᵢ = AᵢBᵢ 进位传播信号:Pᵢ = Aᵢ⊕Bᵢ 进位公式:Cᵢ₊₁ = Gᵢ + PᵢCᵢ
通过展开递归,可以实现各级进位的并行计算,大大提高运算速度。
2.4.3 运算器的组成
定点运算器的基本结构:
1. 算术逻辑单元(ALU):执行运算 2. 通用寄存器组:暂存操作数和运算结果 3. 状态寄存器(PSW):记录运算结果的状态
- ZF(零标志):结果为0
- SF(符号标志):结果为负
- CF(进位/借位标志):无符号运算溢出
- OF(溢出标志):有符号运算溢出
- PF(奇偶标志):结果的奇偶性
- AF(辅助进位标志):半字节进位
4. 数据总线:传输数据 5. 移位器:实现移位操作
运算器的工作过程: 1. 从寄存器或存储器取操作数 2. ALU执行运算 3. 结果送回寄存器或存储器 4. 设置状态标志
2.5 例题分析
例题1:将十进制数-58表示为8位二进制的原码、反码、补码和移码。
解: 58的二进制表示:00111010
原码:1 0111010 = 10111010 反码:1 1000101 = 11000101 补码:1 1000110 = 11000110 移码:0 1000110 = 01000110(补码符号位取反)
例题2:设X = 0.1101,Y = -0.1011,用补码计算X + Y和X - Y。
解: [X]补 = 00.1101(使用双符号位) [Y]补 = 11.0101 [-Y]补 = 00.1011
X + Y:
00.1101
+ 11.0101
100.0010(舍弃进位)= 00.0010 结果:+0.0010
X - Y:
00.1101
+ 00.1011
01.1000(符号位01,正溢出)
例题3:将十进制数-12.75转换为IEEE 754单精度浮点数格式。
解: -12.75 = -1100.11₂ = -1.10011 × 2³
符号位S = 1(负数) 阶码E = 127 + 3 = 130 = 10000010₂ 尾数M = 10011000000000000000000(23位)
IEEE 754表示:1 10000010 10011000000000000000000 十六进制表示:C14C0000H
例题4:已知浮点数X = 2^(-011) × 0.101100,Y = 2^(-010) × 0.111100,求X + Y。
解: 对阶:X的阶码-3,Y的阶码-2,X向Y对阶 X = 2^(-010) × 0.010110
尾数相加:
00.010110
+ 00.111100
01.010010
右规:尾数右移一位,阶码加1 X + Y = 2^(-001) × 0.101001
2.6 本章重点总结
核心概念: - 各种数制之间的转换方法 - 原码、反码、补码、移码的定义和转换 - 定点数和浮点数的表示 - IEEE 754浮点数标准
关键知识点: 1. 进制转换:二进制、八进制、十六进制、十进制之间的转换 2. 码制转换:原码、反码、补码、移码之间的转换关系 3. 补码运算:补码加减法、溢出判断方法 4. 浮点数运算:对阶、尾数运算、规格化、舍入、溢出判断 5. ALU结构:加法器电路、标志位含义
重要公式: - [X]补 + [Y]补 = [X+Y]补 (mod 2^(n+1)) - [X-Y]补 = [X]补 + [-Y]补 - IEEE 754:(-1)^S × 1.M × 2^(E-127)
学习要点: - 熟练掌握各种码制之间的转换 - 理解补码的优势(统一加减法、唯一零表示) - 掌握浮点数运算的完整流程 - 了解ALU的基本结构和工作原理
思考题: 1. 为什么计算机中普遍采用补码表示有符号数? 2. 浮点数加减法为什么要对阶?对阶的原则是什么? 3. 先行进位加法器为什么比行波进位加法器快? 4. IEEE 754标准中为什么要引入非规格化数?