数据的表示与运算
数据的表示与运算
核心定义
原码 是最高位表示符号的直译编码;反码 是原码到补码的过渡编码,正数不变、负数按位取反;补码 是现代计算机最常用的有符号整数表示,反码末位加 1 即得,能把 减法统一为加法 ;移码 是补码符号位取反,常用于表示浮点数的 阶码 ,便于比较大小。
计组主线是 编码统一、运算统一、标志位统一 。ALU 负责算术与逻辑运算;OF 对应 有符号溢出 ;CF 对应 无符号进位/借位 ;SF 反映 结果符号位 ;ZF 反映 结果是否为零 。
n 位补码表示范围:−2n−1∼2n−1−1 ;n 位无符号表示范围:0∼2n−1 。同一串二进制在不同语义下解释不同,例如 8 位 11111111 在无符号下为 255 ,在补码下为 -1 。
S=A⊕B⊕Cin
Cout=AB+(A⊕B)Cin
关键细节 / 操作步骤
- 第一步:先判是 有符号(补码) 还是 无符号 ,再确定 OF/CF 的适用语义。
- 第二步:若问编码转换,正数原码 = 反码 = 补码;负数原码 → 反码(符号位不变,数值位按位取反)→ 补码(反码末位加 1 )。
- 第三步:若问加减法,补码运算中 符号位参与运算 ,结果仍在补码语义下解释。
- 第四步:若问溢出判断,有符号看 OF = 最高进位 ⊕ 次高进位 ;无符号看 CF = 最高位进位输出 。
- 第五步:若问移位运算,区分 逻辑移位(补 0) 与 算术移位(补符号位) 。
- 第六步:若问乘法, Booth 算法核心是 判断最低两位决定加减被乘数再右移 。
- 第七步:若问除法,恢复余数法与加减交替法的核心区别在于 余数为负时是否恢复后再移位 。
- 第八步:若问浮点表示,IEEE 754 中 (−1)S×1.M×2E−偏置 ,单精度偏置值为 127 ,双精度为 1023 。
- 第九步:若问浮点加减,对阶原则是 小阶向大阶看齐 ,舍入方式有 就近舍入、朝 0、朝 +∞、朝 -∞ 。
- 第十步:若问 ALU 功能,写出它是一个统一执行 算术运算与逻辑运算 的组合逻辑部件。
⚠️ 易错辨析
- 补码左移不一定等于乘 2:当 高位溢出截断 时结果会变,必须检查字长。反例:8 位补码
01000000(+64)左移一位变为10000000(-128),不是 +128。- 有符号溢出(OF)和无符号进位(CF)不是一回事:OF 判断 补码语义越界 ,CF 判断 无符号进位/借位 。反例:8 位加法
01111111 + 00000001 = 10000000,OF=1(+127+1 溢出为 -128),但 CF=0(无进位)。- 算术右移要 符号扩展 ,不能和逻辑右移混淆。反例:
10110000算术右移 2 位得11101100,逻辑右移 2 位得00101100。- “最高位是 1 就一定是负数”是错的,必须先看 语义 :无符号数最高位为 1 仍为正。
- 移码不是独立的编码体系,它就是 补码符号位取反 ,常用于浮点阶码以简化大小比较。
💡 技巧与口诀 口诀:有符号看 OF,无符号看 CF;左移先想位宽,右移先想符号;编码转三步:原→反→补(负数取反加一) 。 应用场景:题目只要出现”补码运算""溢出判断""移位结果”,先按 语义→运算→标志位 三步走。位宽一旦固定,所有结果都要在 该位宽内解释 ,不能随意扩大。若问机器数范围,先按字长写范围,再按语义解释。
📝 真题闭环 题目:某 8 位补码加法运算 x+y ,其中 x=[01011010]补 , y=[01101000]补 ,求结果的 OF、CF、SF、ZF 及对应十进制值,并判断是否溢出。
解题思路:
- 先判语义:补码加法 → 有符号 语义,重点看 OF 。
- 做二进制加法:
$01011010 + 01101000 =$11000010 。- 判 OF:最高进位 = 0,次高进位 = 1,OF = 0⊕1 = 1 → 有符号溢出 。
- 判 CF:最高位无进位输出,CF = 0 。
- 判 SF:结果最高位为 1,SF = 1(结果为负) 。
- 判 ZF:结果非零,ZF = 0 。
- 补码转十进制:
$11000010_{\text{补}} =$−62 。答案:OF=1 ,CF=0 ,SF=1 ,ZF=0 ,结果为 -62(溢出) 。验证:+90 + (+104) = +194 超出 8 位补码范围 [−128,127] 。
cd ..