一、数据的表示分类
计算机数据分为数值数据(可计算,定点 / 浮点)、符号数据(文字、标记,ASCII、汉字编码) 选择数据表示要考虑:数类型、数值范围、精度、硬件成本
1. 定点数
小数点位置固定不变,只有纯小数、纯整数两种
- 纯小数:小数点在符号位后,0≤|x|<1-
- 纯整数:小数点在最低位右侧,0≤|x|≤
-1
优点:硬件简单;缺点:表示范围有限
2. 浮点数
格式:N=× M
- M:尾数(决定精度);
- e:阶码(决定数值范围) 机器存储分为:
- 符号 S、阶码 E、尾数 M三部分
3. BCD 码(十进制数)
两种形式
- 字符串:1 字节存 1 位十进制
- 压缩 BCD:1 字节存 2 位十进制(4 位一组,8421 编码)
二、机器码:原码、反码、补码、移码
正数:原码 = 反码 = 补码,符号位 0 负数:符号位固定为 1,数值位不同编码不一样
- 原码符号位 + 真值绝对值;0 有
+0、-0两种表示;减法麻烦,需要比较绝对值 - 反码正数同原码;负数:符号位不变,数值位全部按位取反;一般作为求补码的中间工具
- 补码(最常用!)正数同原码;负数 = 反码 + 1;0 只有唯一一种表示;核心优势:减法可以直接变成加法,硬件只需要加法器
- 移码(偏置码)常用于浮点数阶码;公式:\(\boldsymbol{[e]_{移}=2^k+e}\);移码大小直接反映指数大小,方便比较阶码。
记忆:移码和补码仅符号位相反。
三、IEEE754 浮点数标准
32 位单精度浮点数
S (1 位符号) + E (8 位阶码,偏移 127) + M (23 位尾数) 真值公式:x=(-) ×(1.M) ×
隐藏最高位 1,不存进 M,节省 1bit,提升精度
64 位双精度浮点数
S (1) + E (11 位,偏移 1023) + M (52 位尾数) 真值公式:x=(-) ×(1.M) ×
特殊情况:
- E 全 255,M≠0 → NaN(非数)
- E 全 255,M=0 → 无穷大
- E=0,M=0 → 机器 0
- E=0,M≠0 → 非规格化浮点数
四、字符与汉字编码
ASCII 码
7 位编码,占 1 字节(最高位 0);一共 128 个字符:95 个可打印 + 33 个控制字符
- 0~9:0x30~0x39
- 大写 A-Z:0x41~0x5A
- 小写 a-z:0x61~0x7A
大小写相差 32
汉字编码(三类)
- 输入码(外码):从键盘输入汉字
- 区位码:数字编码,无重码,难记
- 拼音码:好上手,重码多
- 字形码(五笔):按字形编码,重码少,学习成本高
- 交换码:国标码 GB2312、GB18030;用于不同设备之间汉字传输
- 输出码(字模):汉字字形,两种
- 点阵:简单直观,放大失真,占用空间大
- 矢量:存轮廓,放大不失真,质量高
GB18030:不等长编码,兼容 ASCII,包含大量生僻字;UTF-8、UTF-16 是 Unicode 实现方案。
五、校验码:奇偶校验
在原始数据上加 1 位校验位,检测传输错误
- 奇校验:整个编码(数据 + 校验位)里面,1 的总数为奇数
- 偶校验:整个编码里面,1 的总数为偶数
✅特点:只能检测奇数个位错误;无法纠错,检出错误后只能重传,电路简单。
例子:数据10101010
- 偶校验:数数据里 1 有 4 个(偶数)→校验位填 0 →编码
101010100- 奇校验:1 有 4 个,需要凑奇数 →校验位填 1 →编码
101010101
六、定点加减法运算
计算机普遍用补码加法,减法直接转化加法 [X+- Y]{补}=[X]{补}+[+- Y]{补},溢出需要单独判断
补码加法
公式:
[x+y]补 = [x]{补} + [y]{补} (mod)
要点:
- 符号位和数值位一起参与加法运算
- 模
,超过
的进位直接丢掉
例子:x=+1001,y=+0101 [x]{补}=01001, [y]{补}=00101
plaintext
01001 + 00101 -------- 01110[x+y]{补}=01110,真值+1110
✅ 补码减法
减法转加法:[x-y]{补} = [x]{补} + [-y]{补}
求负数补码规则(求补运算): 对[y]{补},连同符号位全部按位取反,末位 + 1,得到[-y]{补}。
例:[y]{补}=00110,则[-y]{补}=11010
本质:把减法统一变成加法,硬件只需要一套加法器电路。
七、溢出判断
溢出:运算结果超出补码能表示范围,结果错误
- 正溢出:两个正数相加,结果 > 最大正数
- 负溢出:两个负数相加,结果 < 最小负数
两种检测方法
双符号位法(变形补码)⭐用 2 位符号位:00 = 正数,11 = 负数
- 结果符号位:
01→正溢出 - 结果符号位:
10→负溢出 00/11:无溢出 逻辑:V=S{n1} 异或S{n2},异或为 1 代表溢出。
- 结果符号位:
单符号位法最高数值位进位C0,符号位进位Cf V=Cf 异或 C0,V=1溢出;Cf和C0不一样就溢出。
记住口诀:同号相加才可能溢出;一正一负相加永远不会溢出!
八、加法器
1. 一位全加器
输入:Ai、Bi(本位两个操作数),Ci低位进位
输出:本位和Si,向高位进位C{i+1}
Si = Ai 异或 Bi 异或 Ci
C{i+1}= AiBi + (Ai异或 Bi)Ci
2. 行波进位加法器(串行进位加法器)
n 个 FA 串联,低位进位输出送到高位进位输入。
✅优点:电路简单
❌缺点:进位逐级传递,位数越大速度越慢,延迟随 n 线性增长。
3. 先行进位 CLA(超前进位加法器)⭐
核心:所有进位不需要等待低位算完,直接由原始输入(Ai,Bi)一次性算出
定义两个函数:
- 本地进位Gi = AiBi:本位自己就能产生进位
- 传送进位Pi=Ai异或Bi:把低位的进位传递到高位
进位公式:C{i+1}=Gi + PiCi}
展开:
C1 = G0 + P0C0
C2 = G1 + P1G0 + P1P0C0
C3 = G2 + P2G1 + P2P1G0 + P2P1P0C0
✅速度快;
❌电路复杂,位数很大时硬件成本太高。
4. 分组先行进位(单级 / 多级分组 CLA)
折中方案:组内先行进位,组间可以串行进位,也可以先行进位
- 单级分组:如 16 位拆成 4 组 ×4bit,组内 CLA,组间串行
- 多级分组(两级先行 BCLA):组内先行,组之间也先行进位,速度更快,硬件更复杂。
课后思考题简答
问:为什么一套加法器可以实现加法和减法?创新点? 答:利用补码减法规则,x-y = [x]{补}+[-y]{补}; 做减法时,把减数y按位取反,最低位加 1 得到\[-y]{补},送入加法器,减法转化为加法运算。 创新点:加减统一为加法运算,硬件只需要加法器,不用单独减法电路,简化运算器。
一句话总结
- 二进制、八、十、十六进制互相转换;BCC、ASCII 码。
- 原码:符号位 + 绝对值;正负 0 表示不同,做加减麻烦
- 反码:正数 = 原码;负数符号不变,数值位按位取反;正负 0 两种形式
- 补码:正数 = 原码;负数 = 反码 + 1;只有一个 0,计算机加减统一用补码加法(减法 = 加负数补码)
- 移码:补码符号位取反;用于浮点数阶码;偏置值偏移,便于比较大小
- 溢出:结果超出字长能表示范围,只有同号相加、异号相减才可能溢出
- 判断方法: ① 双符号位(变形补码):01 正溢出,10 负溢出;00、11 无溢出 ② 最高进位与符号位进位异或,结果 = 1 溢出,0 无溢出
- 浮点数格式:阶码 (移码) + 尾数 (补码),阶码:决定表示范围;尾数:决定精度,规格化:尾数最高位必须是有效 1;浮点数加减:对阶→尾数加减→规格化→舍入→判溢出
小判断题
- 码减法可转化为补码加法。✅
- 原码加减运算不能直接相加,需要单独处理符号。✅
- 移码常用于浮点数尾数编码。❌(是阶码,不是尾数)
- 双符号位 01 代表负溢出。❌(01 正溢出,10 负溢出)
- 补码中 0 只有唯一表示。✅
- 浮点数对阶时,小阶向大阶对齐。✅
- 浮点数溢出看尾数是否溢出。❌(溢出看阶码,尾数溢出可以规格化解决)
- 字长相同,浮点数表示范围大于定点数。✅
- 反码有 + 0、-0 两种表示。✅
- 同号两数相减会发生溢出。❌(同号相加才会溢出)