数据的表示与运算
进制转换、原反补码、定点数与浮点数、算术逻辑单元
1. 数制与编码
计算机中常用的数制包括二进制、八进制、十进制和十六进制。不同数制之间的转换是基础考点。
1.1 常用数制
| 数制 | 基数 | 数码 | 后缀 | 示例 |
|---|---|---|---|---|
| 二进制 | 2 | 0, 1 | B | 1011B |
| 八进制 | 8 | 0-7 | O / Q | 13O |
| 十进制 | 10 | 0-9 | D | 11D |
| 十六进制 | 16 | 0-9, A-F | H | 0BH |
1.2 进制转换动画演示
下面的动画演示了十进制转二进制的除基取余法,点击播放按钮查看转换过程。
1.2 BCD码
BCD(Binary-Coded Decimal)是用二进制编码表示十进制数,每一位十进制数用4位二进制数表示。
| 十进制 | 8421BCD码 | 十进制 | 8421BCD码 |
|---|---|---|---|
| 0 | 0000 | 5 | 0101 |
| 1 | 0001 | 6 | 0110 |
| 2 | 0010 | 7 | 0111 |
| 3 | 0011 | 8 | 1000 |
| 4 | 0100 | 9 | 1001 |
📐 有权码
每一位都有固定的权值。
• 8421码:权为8,4,2,1(最常用)
• 2421码:权为2,4,2,1
• 5211码:权为5,2,1,1
🎯 无权码
没有固定的权值。
• 余3码:8421码+3(0011)
• 格雷码:相邻两位只有一位不同
• 可靠性高,减少出错概率小
BCD码相加时,若结果大于9(1001)或产生进位,则需要加6修正(0110)。因为4位二进制有16种状态,而BCD只用了10种,多余6种状态是无效的。
1.3 字符与字符串
计算机中字符用二进制编码表示字符,最常用的是ASCII码。
| 字符类型 | ASCII码范围 | 示例 |
|---|---|---|
| 数字 0-9 | 30H ~ 39H (48~57) | '0' = 48 = 30H |
| 大写字母 A-Z | 41H ~ 5AH (65~90) | 'A' = 65 = 41H |
| 小写字母 a-z | 61H ~ 7AH (97~122) | 'a' = 97 = 61H |
| 空格 SP | 20H (32) | ' ' = 32 = 20H |
小写字母的ASCII码 = 对应大写字母的ASCII码 + 32(20H)。即 'a' = 'A' + 32。判断大小写相差第5位不同,第6位为1是小写,为0是大写。
1.4 校验码
校验码用于检测和纠正数据传输或存储过程中出现的错误,是提高可靠性的重要手段。
(1)奇偶校验码
在编码中增加一位校验位,使整个编码中1的个数为奇数(奇校验)或偶数(偶校验)。
↑ 奇校验:数据位1的个数为4(偶),校验位为1使总个数为5(奇)
只能检测出奇数位错误,无法检测偶数位错误,也无法纠正错误。编码效率高,实现简单。
(2)海明码(Hamming Code)
由Richard Hamming提出,是一种多重奇偶校验码,可以检测两位错误并纠正一位错误。
- 校验位位置:放在 2i 位置(1, 2, 4, 8, ...)
- 分组规则:第i位数据位的位置编号二进制表示中为1的所有位,由对应校验位负责
- 检错纠错:将各组校验结果按位排列,二进制值即为出错位的位置
(3)循环冗余校验(CRC)
CRC是一种基于多项式的校验码,广泛用于数据链路层和磁盘等领域。
- 原理:将数据看成多项式,用生成多项式G(x)做模2除法,余数即为CRC码
- 特点:检错能力强,可检测出几乎所有常见错误
- 生成多项式:收发双方约定,如CRC-16、CRC-32等标准多项式
2. 定点数表示
定点数是指小数点位置固定不变的数,分为定点整数和定点小数。
2.1 三种机器数
2.2 原码、反码、补码表示范围(n位)
| 编码方式 | 定点整数范围 | 定点小数范围 | 零的个数 |
|---|---|---|---|
| 原码 | -(2n-1-1) ~ +(2n-1-1) | -(1-2-(n-1)) ~ +(1-2-(n-1)) | 2个(+0和-0) |
| 反码 | -(2n-1-1) ~ +(2n-1-1) | -(1-2-(n-1)) ~ +(1-2-(n-1)) | 2个(+0和-0) |
| 补码 | -2n-1 ~ +(2n-1-1) | -1 ~ +(1-2-(n-1)) | 1个 |
3. 移位与乘除运算
移位运算是计算机中的基本运算,可以快速实现乘除。分为算术移位、逻辑移位和循环移位。
3.1 移位运算
🔢 算术移位
符号位不变
左移:低位补0,相当于×2
右移:高位补符号位,相当于÷2
📊 逻辑移位
无符号数的移位
左移:低位补0
右移:高位补0
用于无符号数乘除
🔄 循环移位
移出的位移到另一端
小循环:不带进位位
大循环:带进位位
3.2 原码一位乘法
原码一位乘法是最基础的乘法算法,通过"加法+移位"实现乘法运算。
① 符号位单独处理:符号 = 被乘数符号 ⊕ 乘数符号
② 数值部分:取绝对值相乘,使用双符号位(00)
③ 部分积初始为0,从乘数最低位开始判断
④ 乘数位为1:部分积 + |被乘数|;乘数位为0:部分积 + 0
⑤ 每次运算后,部分积和乘数一起右移一位
⑥ 重复n次得到乘积(n位乘法需n次加法和n次移位)
| 步骤 | 乘数位 | 操作 | 部分积(高位) | 乘数/积(低位) |
|---|---|---|---|---|
| 点击「开始演示」查看计算过程 | ||||
3.3 补码乘法(Booth算法)
Booth算法是一种高效的补码乘法算法,可以直接对补码进行乘法运算,无需符号位单独处理。
① 00 或 11:不加不减,部分积右移一位
② 01:部分积 + [X]补,然后右移一位
③ 10:部分积 + [-X]补,然后右移一位
④ 附加位 Y-1 初值为0,乘数末尾增加一位附加位
⑤ 共进行 n+1 次判断,n 次移位
✅ Booth算法优点
• 符号位参与运算,无需单独处理
• 可直接用补码运算,无需取绝对值
• 适合于有符号数乘法
• 可以处理连续0/1的高效运算
⚠️ 注意事项
• 需要额外附加位,初值为0
• 右移时按补码算术右移(符号位保持)
• 最后一步不移位
• 部分积和乘数采用双符号位
| 步骤 | YiYi-1 | 操作 | 部分积 | 乘数.附加位 |
|---|---|---|---|---|
| 点击「开始演示」查看Booth算法过程 | ||||
3.4 除法运算
除法可以通过"减法+移位"实现,恢复余数法和加减交替法是两种核心方法。
📌 恢复余数法
原理:被除数/余数先减去除数,根据结果判断
• 余数 ≥ 0:够减,商上1,余数左移
• 余数 < 0:不够减,商上0,加回除数恢复,然后左移
特点:简单直观,但恢复步骤可能多次执行
⚡ 加减交替法(不恢复余数法)
原理:根据余数符号直接决定下一步
• 余数 ≥ 0:商上1,左移,减除数
• 余数 < 0:商上0,左移,加除数
特点:无需恢复步骤,效率更高
① 符号位单独处理:商的符号 = 被除数符号 ⊕ 除数符号
② 数值部分:取绝对值相除
③ 被除数位数不够时,高位补0扩展
④ 比较被除数/余数与除数大小决定商位
| 步骤 | 操作 | 余数 | 商 | 说明 |
|---|---|---|---|---|
| 点击「开始演示」查看除法过程 | ||||
3.5 乘除法电路结构
乘除法运算需要专门的硬件电路支持,主要包括寄存器、加法器和控制电路。
• 原码乘法:符号位单独处理,绝对值相乘,需要n次加法和n次移位
• Booth算法:判断相邻两位(YiYi-1),01加、10减、00/11不变,适合补码运算
• 恢复余数法:不够减时需要加回除数,步骤较多但原理简单
• 加减交替法:根据余数符号直接决定下一步操作,效率更高,是现代计算机常用方法
4. 补码加减运算
补码的核心优势在于减法可以转化为加法运算,简化了硬件设计。
3.1 补码加法动画演示
下面演示 8 位补码加法运算过程,展示每一位的计算和进位传递。
3.2 溢出判断方法
- 双符号位法(变形补码):用两位表示符号位,00表示正,11表示负。运算后符号位为01表示正溢出,10表示负溢出。
- 单符号位法:当最高有效位产生进位而符号位不产生进位,或符号位产生进位而最高有效位不产生进位时,产生溢出。
- 实际操作数符号法:两个正数相加结果为负,或两个负数相加结果为正,则溢出。
4. 浮点数表示
浮点数由阶码和尾数组成,阶码是带符号的整数,尾数是定点小数。IEEE 754 是目前最常用的浮点数标准。
4.1 IEEE 754 标准
| 类型 | 总位数 | 符号位 | 阶码 | 尾数 | 阶码偏移量 |
|---|---|---|---|---|---|
| 单精度(float) | 32 | 1位 | 8位 | 23位 | 127 |
| 双精度(double) | 64 | 1位 | 11位 | 52位 | 1023 |
4.2 浮点数分解动画
输入一个十进制数,查看其IEEE 754单精度浮点数的位模式组成。
4.2 浮点数加减运算步骤
浮点数加减运算比定点数复杂,需要经过以下几个步骤:
6. 算术逻辑单元 ALU
ALU是计算机中执行算术和逻辑运算的核心部件,是运算器的核心组成部分。
5.1 ALU 结构示意
5.2 串行加法器与并行加法器
- 串行加法器:只有一个全加器,数据逐位串行送入进行运算。速度慢,硬件成本低。
- 并行加法器:由多个全加器组成,各位同时运算。速度取决于进位传递延迟。
- 进位链:传递进位信号的逻辑线路。分为串行进位(行波进位)和并行进位(先行进位)。