文章目录
- [1. 原码(Sign-Magnitude Representation)](#1. 原码(Sign-Magnitude Representation))
- [2. 反码(Ones' Complement Representation)](#2. 反码(Ones' Complement Representation))
- [3. 补码(Two's Complement Representation)](#3. 补码(Two's Complement Representation))
- [4. 移码(Excess-K Representation)](#4. 移码(Excess-K Representation))
- 总结对比
- 表示范围
- 编码间转换
-
- [原码 ↔ 反码](#原码 ↔ 反码)
- [反码 ↔ 补码](#反码 ↔ 补码)
- [原码 ↔ 补码](#原码 ↔ 补码)
- [补码 ↔ 移码](#补码 ↔ 移码)
在计算机系统中,原码、补码、反码和移码是数值数据(尤其是有符号数)的四种关键编码方式,它们在二进制表示、运算规则和应用场景上各有特点。
1. 原码(Sign-Magnitude Representation)
定义
原码是最直观的数值表示方法,最高位为符号位(0表示正数,1表示负数),其余位表示数值的绝对值。
示例
以8位二进制为例:
+5 的原码:0000 0101
-5 的原码:1000 0101
特点
直观性:符号位直接表示正负,易于理解。
问题:
1、0的表示不唯一:存在+0(00000000)和-0(10000000)两种形式。
2、运算复杂:加减法需判断符号位,无法直接用加法实现减法(如5 - 3需转换为5 + (-3),但原码的加法规则复杂)。
应用场景
早期计算机系统或教学场景中用于理解符号位的概念。
2. 反码(Ones' Complement Representation)
定义
反码是对原码的改进,负数的反码是其原码按位取反(符号位不变)。正数的反码与原码相同。
示例
8位二进制:
+5 的反码:00000101(与原码相同)
-5 的反码:11111010(原码10000101取反)
特点
解决部分运算问题:反码的加法可通过"末位进位循环"实现减法(如5 - 3可转换为5 + (-3)的反码加法)。
问题:
1、0的表示仍不唯一:+0为00000000,-0为11111111。
2、高位溢出:运算时可能产生进位循环,需额外处理。
应用场景
早期计算机系统(如CDC系列)中用于简化减法运算。
3. 补码(Two's Complement Representation)
定义
补码是当前计算机系统中最常用的数值表示方法。负数的补码是其反码的末位加1(即"取反加1")。正数的补码与原码相同。
示例
8位二进制:
+5 的补码:00000101(与原码相同)
-5 的补码:11111011(反码11111010加1)
特点
统一加减法:通过补码,减法可完全转换为加法(如a - b = a + (-b)的补码),简化硬件设计。
0的表示唯一:0的补码为00000000,无-0的概念。
范围对称:n位补码可表示的范围为-2^ (n-1) 到 2^(n-1) -1(如8位补码范围为-128到127)。
溢出处理:运算结果超出范围时,高位自然丢弃(模运算特性)。
应用场景
现代计算机系统(如x86、ARM架构)中所有整数运算均使用补码。
4. 移码(Excess-K Representation)
定义
移码主要用于表示浮点数的阶码(Exponent),其值通过补码的符号位取反得到(即移码 = 补码 + 偏移量,偏移量通常为2^(n-1),n为阶码位数)。
示例
(8位移码,偏移量=128)
阶码真值0的移码:10000000(补码00000000 + 128)
阶码真值-1的移码:01111111(补码11111111 + 128,取低8位)
特点
便于比较:移码将阶码的真值范围映射到无符号数区间,可直接比较大小(如10000001(真值+1) > 10000000(真值0))。
无正负之分:移码本身不区分正负,仅通过数值大小表示阶码的真值。
与补码的关系:移码与补码仅符号位不同,其余位相同。
应用场景
IEEE 754浮点数标准中阶码的编码方式(如单精度浮点数的8位阶码使用移码表示)。
总结对比
| 编码方式 | 符号位 | 负数表示方法 | 0的表示 | 运算特点 | 典型应用 |
|---|---|---|---|---|---|
| 原码 | 最高位 | 绝对值直接表示 | 不唯一(+0/-0) | 加减法需判断符号 | 早期教学 |
| 反码 | 最高位 | 原码按位取反 | 不唯一(+0/-0) | 末位进位循环 | 早期计算机 |
| 补码 | 最高位 | 反码末位加1 | 唯一(000...000) | 统一加减法 | 现代计算机 |
| 移码 | 无(通过补码转换) | 补码 + 偏移量 | 无意义(仅表示阶码) | 便于比较大小 | 浮点数阶码 |
表示范围
| 编码方式 | 8位表示范围 | 关键特性 |
|---|---|---|
| 原码 | -127 ~ +127 | 直观,但存在 ±0 冗余,运算复杂。 |
| 反码 | -127 ~ +127 | 解决部分运算问题,但仍存在 ±0 冗余。 |
| 补码 | -128 ~ +127 | 消除 ±0 冗余,统一加减法,成为现代计算机标准。 |
| 移码 | -128 ~ +127 | 用于浮点数阶码,符号位取反,便于比较大小。 |
编码间转换
原码 ↔ 反码
1、正数
原码 → 反码:数值部分不变,符号位保留。
示例:
+5(原码 00000101)→ 反码 00000101
2、负数
原码 → 反码:符号位保留,数值部分按位取反(0变1,1变0)。
示例:
-5(原码 10000101)→ 反码 11111010
反码 → 原码:符号位保留,数值部分按位取反。
示例:
反码 11111010 → 原码 10000101(即 -5)
反码 ↔ 补码
1、正数
反码 → 补码:数值部分不变,符号位保留。
示例:
+5(反码 00000101)→ 补码 00000101
2、负数
反码 → 补码:符号位保留,数值部分末位加1(可能产生进位)。
示例:
-5(反码 11111010)→ 补码 11111011(末位加1)
补码 → 反码:符号位保留,数值部分末位减1(若末位为0需连续借位)。
示例:
补码 11111011 → 反码 11111010(末位减1)
原码 ↔ 补码
1、正数
原码 ↔ 补码:数值部分和符号位均不变。
示例:
+5(原码 00000101)↔ 补码 00000101
2、负数
原码 → 补码:
符号位保留,数值部分按位取反(得到反码)。
反码的数值部分末位加1(得到补码)。
示例:
-5(原码 10000101)→ 反码 11111010 → 补码 11111011
补码 → 原码:
符号位保留,数值部分末位减1(得到反码)。
反码的数值部分按位取反(得到原码)。
示例:
补码 11111011 → 反码 11111010 → 原码 10000101(即 -5)
补码 ↔ 移码
补码 → 移码:符号位取反,其余位不变。
示例:
补码 11111011(-5)→ 移码 01111011(真值 -5 + 128 = 123)
移码 → 补码:符号位取反,其余位不变。
示例:
移码 01111011(真值 123)→ 补码 11111011(-5)
数学关系:
偏移量为128
移码值 = 补码值 + 偏移量
补码值 = 移码值 - 偏移量