在计算机系统中,数据的表示与编码方式是基础且关键的内容。以下是关于原码、反码、补码、移码的定义及其在8位机器字长下的示例,并结合定点数、浮点数和校验码的相关知识进行系统说明。
一、编码方式(以8位机器字长为例)
-
原码(True Form)
- 定义:最高位为符号位(0表示正,1表示负),其余位表示数值的绝对值。
- 示例:
+1 的原码:00000001
-1 的原码:10000001 - 缺点:0有两种表示(+0:
00000000,-0:10000000),不利于运算。
-
反码(One’s Complement)
- 定义:正数反码同原码;负数反码为符号位不变,其余位按位取反。
- 示例:
+1 的反码:00000001
-1 的反码:11111110 - 仍存在±0问题(+0:
00000000,-0:11111111)。
-
补码(Two’s Complement)
- 定义:正数补码同原码;负数补码为反码加1。
- 示例:
+1 的补码:00000001
-1 的补码:11111111(即11111110+ 1) - 优点:0有唯一表示(
00000000),支持加减统一运算,广泛用于整数存储。 - 8位补码定点整数范围:-128 ~ +127(最小值-128对应
10000000)。
-
移码(Excess Code / Biased Code)
- 定义:在补码基础上将符号位取反,常用于浮点数的阶码表示。
- 示例(偏置值通常为128):
+1 的移码:10000001(补码00000001→ 符号位取反)
-1 的移码:01111111(补码11111111→ 符号位取反) - 特点:便于比较大小(真值越大,移码形式也越大)。
二、定点数与浮点数
-
定点数(Fixed-Point Number)
- 小数点位置固定,分为定点整数和定点小数。
- 8位补码定点整数范围:-128 ~ +127
- 8位补码定点纯小数范围:-1.0 ~ +0.9921875(如
1.0000000表示 -1.0)
-
浮点数(Floating-Point Number)
- 形式:N = 2^E × F,其中 E 为阶码(决定范围),F 为尾数(决定精度)。
- 规格化:使尾数绝对值 ∈ [0.5, 1),提高有效位利用率。
-
IEEE 754 标准
- 单精度(32位):1位符号 + 8位阶码(偏置127)+ 23位尾数
示例:+1.0 表示为0 01111111 00000000000000000000000 - 双精度(64位):1位符号 + 11位阶码(偏置1023)+ 52位尾数
- 特殊值:阶码全1时,尾数为0表示±∞,尾数非0表示 NaN。
- 单精度(32位):1位符号 + 8位阶码(偏置127)+ 23位尾数
三、校验码
-
奇偶校验码(Parity Check)
- 原理:添加1位校验位,使整个编码中“1”的个数为奇数(奇校验)或偶数(偶校验)。
- 能力:仅能检测奇数位错误,不能纠错。
-
海明码(Hamming Code)
- 原理:插入 k 个校验位,满足 2^k ≥ n + k(n为数据位数)。
- 示例:8位数据需4位校验位(因 2⁴=16 ≥ 8+4=12)
- 错误定位:通过各校验组计算出错位置(如 G4G3G2G1=1010 表示第10位出错),可自动纠正单比特错误。
-
循环冗余校验码(CRC, Cyclic Redundancy Check)
- 原理:利用模2除法生成 r 位校验码,附加到原始数据后传输。
- 应用:广泛用于网络通信、磁盘存储等场景,检错能力强(可检测突发错误),但一般不用于纠错。
这些机制共同构成了计算机中数据表示、运算处理与可靠传输的基础,是理解计算机组成原理的核心内容。
补码之所以能统一加减运算,是因为它将负数的表示转化为模运算下的等价正数表示,从而使得减法可以转换为加法来处理。其数学原理基于模(Modulus)运算和同余类(Congruence Class)。
一、数学原理:模运算与同余
在 n 位二进制系统中,数值的表示范围是有限的,最大可表示 2n2^n2n 个不同的值。当运算结果超出这个范围时,会发生“溢出”,但计算机自动保留低 n 位——这相当于对 2n2^n2n 取模。
例如,在 8 位系统中:
- 最大无符号整数为 255(即
11111111) - 若再加 1,则变为
00000000,即 256 ≡ 0 (mod 256)
因此,8 位系统的模为 28=2562^8 = 25628=256。
补码的核心思想:
负数 −x-x−x 的补码表示,实际上是 2n−x2^n - x2n−x,也就是 −x≡2n−x(mod2n)-x \equiv 2^n - x \pmod{2^n}−x≡2n−x(mod2n)
这样,任何减法运算 A−BA - BA−B 都可以转化为:
A−B=A+(−B)≡A+(2n−B)(mod2n)
A - B = A + (-B) \equiv A + (2^n - B) \pmod{2^n}
A−B=A+(−B)≡A+(2n−B)(mod2n)
而 (2n−B)(2^n - B)(2n−B) 正是 BBB 的补码形式。
二、示例说明(以 8 位为例)
计算:5−35 - 35−3
传统方式:
5−3=25 - 3 = 25−3=2
使用补码转换为加法:
- 5 的补码:
00000101 - 3 的补码:
00000011 - -3 的补码:先取反得
11111100,再加 1 得11111101
执行加法:
00000101 (5)
+ 11111101 (-3)
------------
1 00000010 (结果为 2,最高位进位被丢弃)
结果为 00000010 = 2,正确!
这里的进位“1”超出了8位,被自然截断(模256意义下),正好得到正确结果。
三、为什么能统一加减?
-
无需区分加减操作
CPU 只需实现一个加法器,通过控制是否取补码即可完成加减运算。- 加法:直接相加
- 减法:将减数取补码后再相加
-
0 的唯一表示
补码中没有 +0 和 -0 的区别:- +0:
00000000 - -0: 按规则计算得
00000000(因为 -0 的补码也是 0)
→ 避免了原码/反码中的歧义问题。
- +0:
-
符号位参与运算
补码的符号位与其他位一样参与加法运算,无需单独处理符号逻辑。
四、总结:补码统一加减的三大优势
| 特性 | 说明 |
|---|---|
| 模运算支持 | 利用 2n2^n2n 模系统,使负数等价于一个大的正数 |
| 减法转加法 | A−B=A+(−B)A - B = A + (-B)A−B=A+(−B),其中 −B-B−B 用补码表示 |
| 硬件简化 | 只需加法器,无需专门的减法电路 |


7460

被折叠的 条评论
为什么被折叠?



