首页 / 第1章 数据的表示与运算

数据的表示与运算

进制转换、原反补码、定点数与浮点数、算术逻辑单元

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 进制转换动画演示

下面的动画演示了十进制转二进制的除基取余法,点击播放按钮查看转换过程。

十进制转二进制 - 除基取余法
准备开始
除基取余法:将十进制数反复除以2,记录每次的余数,直到商为0,然后将余数从下往上读取即为二进制结果。
💡
记忆技巧 二进制转十六进制:4位一组,从右往左分组,不足补0。八进制则是3位一组。

1.2 BCD码

BCD(Binary-Coded Decimal)是用二进制编码表示十进制数,每一位十进制数用4位二进制数表示。

十进制 8421BCD码 十进制 8421BCD码
0000050101
1000160110
2001070111
3001181000
4010091001

📐 有权码

每一位都有固定的权值。
• 8421码:权为8,4,2,1(最常用)
• 2421码:权为2,4,2,1
• 5211码:权为5,2,1,1

🎯 无权码

没有固定的权值。
• 余3码:8421码+3(0011)
• 格雷码:相邻两位只有一位不同
• 可靠性高,减少出错概率小

⚠️
BCD码运算修正规则
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
0
1
1
0
1
0
0

↑ 奇校验:数据位1的个数为4(偶),校验位为1使总个数为5(奇)

⚠️
奇偶校验特点
只能检测出奇数位错误,无法检测偶数位错误,也无法纠正错误。编码效率高,实现简单。

(2)海明码(Hamming Code)

由Richard Hamming提出,是一种多重奇偶校验码,可以检测两位错误并纠正一位错误。

2k ≥ n + k + 1
n:数据位位数    k:校验位位数
  • 校验位位置:放在 2i 位置(1, 2, 4, 8, ...)
  • 分组规则:第i位数据位的位置编号二进制表示中为1的所有位,由对应校验位负责
  • 检错纠错:将各组校验结果按位排列,二进制值即为出错位的位置

(3)循环冗余校验(CRC)

CRC是一种基于多项式的校验码,广泛用于数据链路层和磁盘等领域。

  • 原理:将数据看成多项式,用生成多项式G(x)做模2除法,余数即为CRC码
  • 特点:检错能力强,可检测出几乎所有常见错误
  • 生成多项式:收发双方约定,如CRC-16、CRC-32等标准多项式

2. 定点数表示

定点数是指小数点位置固定不变的数,分为定点整数和定点小数。

2.1 三种机器数

真值 x = +1011
+11
原码 [x]原
0 1011
反码 [x]反
0 1011
补码 [x]补
0 1011
真值 x = -1011
-11
原码 [x]原
1 1011
反码 [x]反
1 0100
补码 [x]补
1 0101
📌
正数的原码、反码、补码都相同 负数的反码 = 原码除符号位外各位取反;补码 = 反码 + 1(即原码除符号位外取反加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 移位运算

移位运算交互动画
原数(8位补码):
移位后:
点击按钮开始演示

🔢 算术移位

符号位不变
左移:低位补0,相当于×2
右移:高位补符号位,相当于÷2

📊 逻辑移位

无符号数的移位
左移:低位补0
右移:高位补0
用于无符号数乘除

🔄 循环移位

移出的位移到另一端
小循环:不带进位位
大循环:带进位位

3.2 原码一位乘法

原码一位乘法是最基础的乘法算法,通过"加法+移位"实现乘法运算。

原码一位乘法规则:
① 符号位单独处理:符号 = 被乘数符号 ⊕ 乘数符号
② 数值部分:取绝对值相乘,使用双符号位(00)
③ 部分积初始为0,从乘数最低位开始判断
④ 乘数位为1:部分积 + |被乘数|;乘数位为0:部分积 + 0
⑤ 每次运算后,部分积和乘数一起右移一位
⑥ 重复n次得到乘积(n位乘法需n次加法和n次移位)
原码一位乘法交互演示
步骤 乘数位 操作 部分积(高位) 乘数/积(低位)
点击「开始演示」查看计算过程
原码一位乘法核心:部分积初值为0,每次根据乘数最低位决定是否加被乘数,然后右移。乘数寄存器同时存储乘积低位。

3.3 补码乘法(Booth算法)

Booth算法是一种高效的补码乘法算法,可以直接对补码进行乘法运算,无需符号位单独处理。

Booth算法规则(判断乘数相邻两位 YiYi-1):
① 00 或 11:不加不减,部分积右移一位
② 01:部分积 + [X],然后右移一位
③ 10:部分积 + [-X],然后右移一位
④ 附加位 Y-1 初值为0,乘数末尾增加一位附加位
⑤ 共进行 n+1 次判断,n 次移位

✅ Booth算法优点

• 符号位参与运算,无需单独处理
• 可直接用补码运算,无需取绝对值
• 适合于有符号数乘法
• 可以处理连续0/1的高效运算

⚠️ 注意事项

• 需要额外附加位,初值为0
• 右移时按补码算术右移(符号位保持)
• 最后一步不移位
• 部分积和乘数采用双符号位

Booth算法交互演示
步骤 YiYi-1 操作 部分积 乘数.附加位
点击「开始演示」查看Booth算法过程
Booth算法核心:通过判断乘数相邻两位的变化(01→加,10→减,00/11→不变)来决定操作,实现补码直接乘法。

3.4 除法运算

除法可以通过"减法+移位"实现,恢复余数法和加减交替法是两种核心方法。

📌 恢复余数法

原理:被除数/余数先减去除数,根据结果判断
• 余数 ≥ 0:够减,商上1,余数左移
• 余数 < 0:不够减,商上0,加回除数恢复,然后左移
特点:简单直观,但恢复步骤可能多次执行

⚡ 加减交替法(不恢复余数法)

原理:根据余数符号直接决定下一步
• 余数 ≥ 0:商上1,左移,减除数
• 余数 < 0:商上0,左移,加除数
特点:无需恢复步骤,效率更高

原码除法规则:
① 符号位单独处理:商的符号 = 被除数符号 ⊕ 除数符号
② 数值部分:取绝对值相除
③ 被除数位数不够时,高位补0扩展
④ 比较被除数/余数与除数大小决定商位
除法运算交互演示
步骤 操作 余数 说明
点击「开始演示」查看除法过程
除法运算核心:恢复余数法简单但效率低;加减交替法无需恢复步骤,是现代计算机的主流方法。

3.5 乘除法电路结构

乘除法运算需要专门的硬件电路支持,主要包括寄存器、加法器和控制电路。

乘法器电路基本结构
乘法器核心组件:部分积寄存器P、乘数寄存器Y、被乘数寄存器X、n位加法器、移位控制逻辑。每次迭代:判断Y最低位→条件加法→右移。
除法器电路基本结构
除法器核心组件:余数寄存器R、商寄存器Q、除数寄存器D、n位加减法器、移位控制逻辑。每次迭代:减法比较→判断余数符号→确定商位→左移。
💡
乘除法运算要点总结
原码乘法:符号位单独处理,绝对值相乘,需要n次加法和n次移位
Booth算法:判断相邻两位(YiYi-1),01加、10减、00/11不变,适合补码运算
恢复余数法:不够减时需要加回除数,步骤较多但原理简单
加减交替法:根据余数符号直接决定下一步操作,效率更高,是现代计算机常用方法

4. 补码加减运算

补码的核心优势在于减法可以转化为加法运算,简化了硬件设计。

[x + y]补 = [x]补 + [y]补      [x - y]补 = [x]补 + [-y]补

3.1 补码加法动画演示

下面演示 8 位补码加法运算过程,展示每一位的计算和进位传递。

补码加法运算演示
被加数 A =
加数 B =
进位:
结果 S =
溢出判断:双符号位法(变形补码)—— 运算结果的两个符号位不同时表示溢出。01为正溢出,10为负溢出。

3.2 溢出判断方法

  • 双符号位法(变形补码):用两位表示符号位,00表示正,11表示负。运算后符号位为01表示正溢出,10表示负溢出。
  • 单符号位法:当最高有效位产生进位而符号位不产生进位,或符号位产生进位而最高有效位不产生进位时,产生溢出。
  • 实际操作数符号法:两个正数相加结果为负,或两个负数相加结果为正,则溢出。

4. 浮点数表示

浮点数由阶码和尾数组成,阶码是带符号的整数,尾数是定点小数。IEEE 754 是目前最常用的浮点数标准。

N = (-1)S × M × 2E
S:符号位    M:尾数(含隐藏的1)    E:阶码(移码表示)

4.1 IEEE 754 标准

类型 总位数 符号位 阶码 尾数 阶码偏移量
单精度(float) 32 1位 8位 23位 127
双精度(double) 64 1位 11位 52位 1023

4.2 浮点数分解动画

输入一个十进制数,查看其IEEE 754单精度浮点数的位模式组成。

IEEE 754 单精度浮点数分解
符号位 S
0
1位
阶码 E(移码)
10000010
8位,偏移量127
尾数 M(隐藏1.)
10001100000000000000000
23位
真值计算
-12.375
阶码真值
+3
规格化尾数
1.100011
规格化:IEEE 754 规定尾数最高位总是1,因此可以省略这个1,节省一位存储空间(隐藏位技术)。
⚠️
特殊值表示 阶码全0且尾数全0:机器零;阶码全0尾数非0:非规格化数;阶码全1尾数全0:无穷大;阶码全1尾数非0:NaN(非数)

4.2 浮点数加减运算步骤

浮点数加减运算比定点数复杂,需要经过以下几个步骤:

1
对阶
使两个数的阶码相同。小阶向大阶对齐,尾数右移,阶码增大。尾数每右移一位,阶码加1,直到阶码相等。
2
尾数加减
对阶后,尾数进行加减运算,方法与定点数加减相同。
3
规格化
将结果化为规格化形式。左规:尾数左移,阶码减小(结果绝对值小于1时);右规:尾数右移,阶码增大(结果溢出时)。
4
舍入
对尾数右移时移出的位进行舍入处理。常用方法:0舍1入法(类似四舍五入)、恒置1法。
5
溢出判断
根据阶码判断是否溢出。阶码上溢:大于最大阶码(正溢出);阶码下溢:小于最小阶码(按机器零处理)。

6. 算术逻辑单元 ALU

ALU是计算机中执行算术和逻辑运算的核心部件,是运算器的核心组成部分。

5.1 ALU 结构示意

ALU 基本结构与数据流向
ALU
ALU 功能:算术运算(加、减、乘、除)、逻辑运算(与、或、非、异或)、移位运算、比较运算等。

5.2 串行加法器与并行加法器

  • 串行加法器:只有一个全加器,数据逐位串行送入进行运算。速度慢,硬件成本低。
  • 并行加法器:由多个全加器组成,各位同时运算。速度取决于进位传递延迟。
  • 进位链:传递进位信号的逻辑线路。分为串行进位(行波进位)和并行进位(先行进位)。
Ci = Gi + Pi·Ci-1
Gi = Ai·Bi(进位生成函数)    Pi = Ai⊕Bi(进位传递函数)