一、数据的表示格式与机器码
数据分数值型(定点、浮点)与非数值型(字符、汉字)。机器字长、存储字长、数据通路宽度三者可以不等。定点数的小数点隐含固定、不占存储位;8 位补码整数范围是 -128~+127,比原码多一个数,原因是补码中 ±0 合并为同一编码,省出的编码给了 -128。
浮点数按表示,尾数定精度、阶码定范围、基数恒为 2 不存储。常见设计是阶码用移码(保持单调性,可直接按无符号数比较,便于对阶)、尾数用补码(便于加减)。规格化要求尾数最高数值位与符号位不同,不满足则左规,尾数溢出则右规。IEEE 754 单精度为 1 符号+8 阶码+23 尾数,真值
;双精度 1+11+52、偏置 1023;规格化数尾数最高位的 1 不存储。阶码全 1 且尾数全 0 为 ±∞,尾数非 0 为 NaN;阶码全 0 且尾数非 0 为非规格化数。浮点范围宽但无法精确表示 0.1,财务计算须用定点。
正数的原码、反码、补码完全相同;负数反码是数值位取反,补码是反码末位加 1,移码是补码符号位取反;由补码反推原码是符号位不变、数值位取反加 1。补码的本质是模 2ⁿ 运算,相当于把数轴首尾接成圆环,故减法可化为加法、符号位可直接参与运算、零的表示唯一、溢出易检测——这是它成为标准的四个理由。
第二篇 汉字的表示和编码
汉字量大且为二维字形,须用 2 字节以上。四种编码分工:输入码面向人、方式多样不唯一,需码表映射;国标码用于系统间交换;机内码是机内实际存储处理的编码;字形码描述视觉形状。GB2312 用 94 区×94 位,收 6763 汉字与 682 符号,一级汉字 3755 个按拼音排(16—55 区),二级 3008 个按部首笔画排(56—87 区)。
转换链:区位码(十进制)先转十六进制,加 2020H 得国标码(避开 ASCII 控制字符区),再加 8080H 得机内码(两字节最高位置 1,与最高位恒为 0 的 ASCII 区分,消除歧义);一步公式为区位码十六进制加 A0A0H。国标码最高位为 0,机内码为 1。
点阵字模占用字节 = 行×列/8,16×16 为 32 字节、24×24 为 72、32×32 为 128;缺点是放大失真、每种字号需单独存。矢量字模用曲线方程描述轮廓,任意缩放不失真、一套数据支持所有字号,但需实时计算。后续 GBK 收 21003 字,GB18030 用单双四字节变长并兼容 Unicode;UTF-8 中汉字通常占 3 字节。
第三篇 校验码
数据会因电磁干扰、器件老化、宇宙射线软错误、信道噪声发生位翻转,校验码用冗余位换可靠性。最小码距 d 决定能力:检 e 位错需,纠 t 位错需 d≥2t+1(以各合法码字为心、t 为半径画球,球不重叠才能唯一判定归属),同时纠 t 检 e 需 d≥t+e+1。码率 = 有效信息位/总长。
奇偶校验只加 1 位,d=2,仅检奇数位错、不能纠错,偶数位同时出错完全漏检;二维校验行列同做,可纠 1 位,但矩形四角错漏检。海明码用多个校验位交叉覆盖,d=3 可纠 1 检 1;校验位数由定(4 位信息需 3 位、8 位需 4 位);校验位须放在位号为 2 的幂次处,P_i 校验所有位号二进制第 i 位为 1 的位;校验子的二进制值直接等于出错位号,取反即纠正。再加一位全校验位使 d=4,成 SEC-DED(纠 1 检 2),是服务器内存 ECC 的基础。
CRC 不纠错但检错极强,用模 2 除法(不进位借位,加减皆等于异或):信息位后补 r 个 0(r 是生成多项式最高次幂,不是位数),除以 G 得 r 位余数,发送"信息位拼余数",接收端再除,余数为 0 即无错;能检出全部单双比特错和长度 ≤r 的突发错。硬件用线性反馈移位寄存器实现,只需移位与异或,故广泛用于磁盘、以太网、ZIP、PNG。
四、补码加减法与溢出检测
[x+y]补 = [x]补 + [y]补 (mod 2ⁿ),符号位与数值位一同运算,最高位进位直接丢弃。[x-y]补 = [x]补 + [-y]补,求 [-y]补 须对 [y]补连同符号位取反加 1(只取反数值位是常见错误),故硬件只需一套加法器。
溢出指结果超出表示范围,本质是在补码圆环上走过头绕到对面。只有同号相加(或异号相减)才可能溢出,正加负绝不溢出。溢出不同于进位:溢出针对有符号数、标志 OF、是错误;进位针对无符号数、标志 CF、是正常现象;同一串二进制按两种解释结论可能相反,故 CPU 须设两个独立标志。
检测方法一是进位异或法 V=C₀⊕C₁,C₀ 为符号位产生的进位、C₁ 为最高数值位向符号位的进位,相同无溢出、不同则溢出。方法二是双符号位法(变形补码、模 4 补码):正数写 00、负数写 11,运算后 00 为正无溢出、11 为负无溢出、01 正溢出、10 负溢出,口诀"相同无溢出、不同有溢出",V=S₁⊕S₂。此法只需扩一位加一个异或门,判断直观且能区分方向,考试首选。
五、行波进位加法器
全加器有三输入 Aᵢ、Bᵢ、Cᵢ₋₁ 与两输出 Sᵢ、Cᵢ,比半加器多一个低位进位。Sᵢ=Aᵢ⊕Bᵢ⊕Cᵢ₋₁,Cᵢ=AᵢBᵢ+(Aᵢ⊕Bᵢ)Cᵢ₋₁,前项是本位自己生成进位,后项是把低位进位向上传递。令 Gᵢ=AᵢBᵢ、Pᵢ=Aᵢ⊕Bᵢ,则 Sᵢ=Pᵢ⊕Cᵢ₋₁、Cᵢ=Gᵢ+PᵢCᵢ₋₁。
行波进位加法器把 n 个全加器串联,进位像水波逐级传递,故又称串行进位。单个全加器进位延迟约 2 级门,n 位总延迟约 2nt,即 O(n):32 位需约 64 级门,严重限制主频。优点是结构简单、面积小、成本低、易扩展。
用加法器实现减法只需两处改动:每个 B 输入前接异或门,另一端接控制信号 M,利用 B⊕0=B、B⊕1=B̄ 实现取反;同时把最低位进位输入 C₋₁ 接到 M,M=1 时自动加 1。故 M=0 做加法、M=1 做减法,n 个异或门就省掉了整个减法器。运算器还输出 Z(零)、N(符号)、V(有符号溢出)、C(无符号进位)四个标志送入 PSW,作为条件转移指令的判断依据。
六、先行进位加法器(CLA)
瓶颈在 Cᵢ=Gᵢ+PᵢCᵢ₋₁ 的递推依赖。先行进位把递推式完全展开,消去中间进位,使每个 Cᵢ 只依赖 G、P 与初始进位 C₋₁;G、P 只由 A、B 决定可并行算出,于是所有进位同时得到。4 位展开后 C₃=G₃+P₃G₂+P₃P₂G₁+P₃P₂P₁G₀+P₃P₂P₁P₀C₋₁,进位延迟约 3 级门且与位数无关,比行波的 8t 快约 2.3 倍。
为便于级联,定义组内生成函数 G*=G₃+P₃G₂+P₃P₂G₁+P₃P₂P₁G₀ 与组内传递函数 P*=P₃P₂P₁P₀,则 C₄=G*+P*C₋₁,形式与单级完全相同,故可把一组 4 位当作一个"大位"再做一次先行进位——这是多级分组的理论基础。直接把 32 位展开会有 32 项、最长项需 32 输入与门,超出门电路扇入限制而无法实现,故必须分组:组内先行、组间也先行。16 位分 4 组×4 位两级,延迟约 5~8t(行波约 32t);32 位分 8 组两级,约 6t(行波约 64t),加速超 10 倍;64 位可三级分组约 7~8t。位数增 16 倍延迟只增 2 倍多,即 O(log n)。经典芯片是 74LS181(4 位 ALU)与 74LS182(先行进位发生器)。取舍是行波用时间换面积、CLA 用面积换时间。现代 CPU 多用前缀加法器(Kogge-Stone、Brent-Kung、Han-Carlson),核心是逐级合并 (G,P) 对,与 CLA 同源;多操作数连加则用进位保留加法器 CSA。
七、总结
本章从数据表示讲到运算实现。前两篇解决编码问题:补码凭模运算特性成为机器码标准,IEEE 754 统一了浮点数格式;汉字须经输入码、国标码、机内码、字形码四重转换;奇偶、海明、CRC 三种校验码以冗余换可靠性,码距决定检错纠错能力。后三篇解决运算问题:补码把减法化为加法,溢出只在同号相加时发生,双符号位法判断最直观;行波进位结构简单但延迟随位数线性增长,先行进位借 G、P 函数并行生成进位,把延迟压到对数级。学完这一章,才算真正看见了 CPU 内部。