在计算机中,采用数字化方式来表示数据,数据有无符号数和带符号数之分,其中带符号数根据其编码的不同又有原码、补码和反码3种表示形式。
2.1.1计算机中的数值数据
计算机中所有数据最终都以二进制形式存储。数值数据分为 无符号数 和 带符号数,而带符号数有 原码、补码、反码 三种表示形式。以下分步骤详细说明:
一、无符号数(Unsigned)
定义:所有二进制位均为数值位,没有符号位。
表示范围:
- 8位二进制:0 ~ 255
- 16位二进制:0 ~ 65535
用途:适用于仅处理非负数的场景(如地址运算、像素值)。
二、带符号数(Signed)
核心思想:最高位为符号位,0表示正,1表示负。数值位为剩余位。
1. 原码(True Form)
规则:
- 正数:符号位为0,数值部分为绝对值。
- 负数:符号位为1,数值部分为绝对值。
缺点:
+0
(0000 0000)和-0
(1000 0000)存在两种表示,导致运算复杂。- 直接加减法需处理符号位,硬件设计复杂。
示例(8位):
+5
→0000 0101
-5
→1000 0101
2. 反码(One’s Complement)
规则:
- 正数:与原码相同。
- 负数:符号位保持1,数值位逐位取反。
示例:
-5
的反码 =1111 1010
- 缺点:仍然存在
+0
(0000 0000)和-0
(1111 1111)。
3. 补码(Two’s Complement)
规则:
- 正数:与原码相同。
- 负数:反码 + 1(忽略最高位溢出)。
优点:
- 解决±0问题,统一运算规则。
- 实现加减法的统一处理。
示例(8位):
-
-5
的补码:
三、进制转换
数值在计算机中存储前需转换为二进制,但编写代码时可写为十进制、八进制(前缀0
)、十六进制(前缀0x
)。
进制转换示例(十进制→二进制):
27₁₀ → 11011₂
四、补码的加减法(关键!)
计算机通过补码统一加减法:
- 加法:直接按位加,溢出位舍弃。
- 减法:
A - B
转换为A + (-B)
的补码加法。
示例(8位):
-
5 - 3 = 5 + (-3)
5
补码:0000 0101
-3
补码:1111 1101
0000 0101 + 1111 1101 ------------ 0000 0010 → 2₁₀(舍弃溢出)
总结
类型 | 表示方法 | 示例(8位,-5) |
---|---|---|
原码 | 符号位 + 绝对值的二进制 | 1000 0101 |
反码 | 符号位不变,数值位取反 | 1111 1010 |
补码 | 反码 + 1 | 1111 1011 |
通过流程图和示例,可以清晰理解数值数据的存储与运算原理。补码机制是计算机高效处理负数的关键设计!
2.1.3原码表示法
原码是计算机中表示带符号数的最基本方法,适用于整数和小数。其核心特点是 符号位与数值位分离处理。以下是详细的实现规则、特点分析及流程图辅助说明:
一、原码定义
原码由 符号位 + 绝对值的二进制 构成,符号位为0表示正数,符号位为1表示负数。
1. 纯小数的原码
[ X ] 原 = { X 如果 0 ≤ X < 1 1 − X 如果 − 1 < X ≤ 0 [X]_{\text{原}} = \begin{cases} X & \text{如果 } 0 \le X < 1 \\ 1 - X & \text{如果 } -1 < X \le 0 \end{cases} [X]原={X1−X如果 0≤X<1如果 −1<X≤0
- 示例:
- X = + 0.1011 X = +0.1011 X=+0.1011 ⇒ [ X ] 原 = 0.1011 [X]_{\text{原}} = 0.1011 [X]原=0.1011
- X = − 0.1011 X = -0.1011 X=−0.1011 ⇒ [ X ] 原 = 1 − ( − 0.1011 ) = 1.1011 [X]_{\text{原}} = 1 - (-0.1011) = 1.1011 [X]原=1−(−0.1011)=1.1011
2. 纯整数的原码
[ X ] 原 = { X 如果 0 ≤ X < 2 n 2 n + ∣ X ∣ 如果 − 2 n < X ≤ 0 [X]_{\text{原}} = \begin{cases} X & \text{如果 } 0 \le X < 2^n \\ 2^n + |X| & \text{如果 } -2^n < X \le 0 \end{cases} [X]原={X2n+∣X∣如果 0≤X<2n如果 −2n<X≤0
- 示例(8位整数):
- X = + 13 X = +13 X=+13 ⇒ [ X ] 原 = 0000 1101 [X]_{\text{原}} = 0000\,1101 [X]原=00001101
- X = − 13 X = -13 X=−13 ⇒ [ X ] 原 = 1000 1101 [X]_{\text{原}} = 1000\,1101 [X]原=10001101
二、关键特点
-
零的表示不唯一:
- [ + 0 ] 原 = 0000 0000 [+0]_{\text{原}} = 0000\,0000 [+0]原=00000000, [ − 0 ] 原 = 1000 0000 [-0]_{\text{原}} = 1000\,0000 [−0]原=10000000
- 导致运算需额外处理零问题(如比较时需判断两种情况)。
-
数值范围对称:
- n位带符号整数: − ( 2 n − 1 − 1 ) ≤ X ≤ 2 n − 1 − 1 -(2^{n-1}-1) \le X \le 2^{n-1}-1 −(2n−1−1)≤X≤2n−1−1
- n位小数: − ( 1 − 2 − ( n − 1 ) ) ≤ X ≤ 1 − 2 − ( n − 1 ) -(1 - 2^{-(n-1)}) \le X \le 1 - 2^{-(n-1)} −(1−2−(n−1))≤X≤1−2−(n−1)
-
符号位独立性:
- 运算时需拆分符号位和数值位:加减法需单独处理符号,复杂度高。
-
硬件实现复杂度:
- 加减法需要多步判断,乘除法规则简单(直接按有符号位运算)。
三、原码转换流程
以下为真值 X X X 转换为原码的流程图及步骤说明:
转换步骤示例(以X = -13 / 8位整数为例):
- 符号位确定:负数 ⇒ 符号位1
- 绝对值转为二进制:13 → 00001101
- 合成原码:符号位1 + 绝对值位0001101 → 10001101
四、原码的运算与局限性
-
加减法问题(必须分开处理):
- 原码加法:需判断符号位是否相同,不同时转换为减法。
- 原码减法:转换为加法,可能导致结果符号多次翻转。
-
乘法优势:
- 直接取绝对值相乘,符号位单独处理(异或操作)。
- 示例(
−
0.1011
×
+
0.1101
-0.1011 \times +0.1101
−0.1011×+0.1101):
- 符号位:1 ⊕ 0 = 1
- 数值位:0.1011 × 0.1101 → 直接二进制乘法
五、原码与其他机器数的对比分析
特性 | 原码 | 补码 | 反码 |
---|---|---|---|
零的表示 | 不唯一(±0) | 唯一(单0) | 不唯一(±0) |
符号位处理 | 独立判断 | 参与运算 | 参与运算 |
加减法实现 | 复杂(需分支) | 统一加法实现 | 类似原码但有进位 |
硬件电路复杂度 | 高 | 低 | 较高 |
六、应用场景
- 特殊运算场景:FPU浮点数尾数运算(需要高精度符号位处理)。
- 教学与理解基础:学习计算机符号表示的基本模型。
- 非实时系统:早期简单硬件设备中偶有应用。
总结
原码作为最直观的符号表示方法,其设计直观但运算复杂性高,现代计算机多用补码替代。理解原码是掌握补码、反码的基础,特别需注意零的双重表示带来的潜在问题。
2.1.4补码表示法
为了深入理解补码表示法,我们将从概念、转换方法、运算规则、溢出判断以及实际应用等多个角度进行全面讲解,并结合流程图辅助理解。
流程图说明:
- 开始节点标识流程起点
- 判断数值符号:首先确定待转换数的正负
- 负数处理分支:
- 符号位置1
- 数值位按位取反
- 最低位加1
- 检查溢出时执行模运算(按2^n+1取模)
- 正数处理分支:
- 符号位置0
- 原始数值位不做修改
- 最终组合符号位和数值位生成补码
- 所有路径汇聚到结束节点输出最终补码
一、补码定义与数学基础
1. 模运算(Modular Arithmetic)
- 模(Module):计量系统的容量,如时钟的模为12。
- 同余(Congruence):若
A
=
B
m
o
d
M
A = B \mod M
A=BmodM,则
A
A
A 和
B
B
B 在模
M
M
M 下等价。
- 例: 8 + 10 = 18 = 6 m o d 12 8 + 10 = 18 = 6 \mod 12 8+10=18=6mod12,时钟自动回绕。
2. 补码的思想
- 将负数表示为模与绝对值的差,使得加法和减法统一:
X 补 = { X if X ≥ 0 2 n + X if X < 0 X_{\text{补}} = \begin{cases} X & \text{if } X \geq 0 \\ 2^n + X & \text{if } X < 0 \end{cases} X补={X2n+Xif X≥0if X<0
二、补码的表示方法
1. 纯小数的补码
- 范围: − 1 ≤ X < 1 -1 \leq X < 1 −1≤X<1
- 公式:
[ X ] 补 = { X 0 ≤ X < 1 2 + X − 1 ≤ X < 0 ( m o d 2 ) [X]_{补} = \begin{cases} X & 0 \leq X < 1 \\ 2 + X & -1 \leq X < 0 \end{cases} \quad (\mod 2) [X]补={X2+X0≤X<1−1≤X<0(mod2) - 示例: X = − 0.1010 → [ X ] 补 = 10 − 0.1010 = 1.0110 X = -0.1010 \rightarrow [X]_{补} = 10 - 0.1010 = 1.0110 X=−0.1010→[X]补=10−0.1010=1.0110
2. 纯整数的补码
- 范围: − 2 n ≤ X < 2 n -2^{n} \leq X < 2^{n} −2n≤X<2n
- 公式:
[ X ] 补 = { X 0 ≤ X < 2 n 2 n + 1 + X − 2 n ≤ X < 0 ( m o d 2 n + 1 ) [X]_{补} = \begin{cases} X & 0 \leq X < 2^n \\ 2^{n+1} + X & -2^n \leq X < 0 \end{cases} \quad (\mod 2^{n+1}) [X]补={X2n+1+X0≤X<2n−2n≤X<0(mod2n+1) - 示例:
X
=
−
5
→
[
X
]
补
=
100000
−
101
=
1111011
X = -5 \rightarrow [X]_{补} = 100000 - 101 = 1111011
X=−5→[X]补=100000−101=1111011(8位补码为
11111011
)
3. 补码零的唯一性
- [ + 0 ] 补 = [ − 0 ] 补 = 0 [+0]_{补} = [-0]_{补} = 0 [+0]补=[−0]补=0,消除原码中零的二义性。
三、补码的转换与快速算法
1. 正数的补码
- 与原码、反码相同。例如, + 5 10 = 00000101 2 +5_{10} = \text{00000101}_2 +510=000001012。
2. 负数的补码
- 常规方法:反码加1
- 原码 → 反码(符号位不变,其余取反) → 补码(+1)。
- 快捷方法:(针对纯小数或整数)
- 从最低位向右找到第一个
1
,左侧各位取反,右侧全部保留。
示例:
原码:1.1110011000 → 补码:1.0001101000 \text{原码:1.1110011000} \rightarrow \text{补码:1.0001101000} 原码:1.1110011000→补码:1.0001101000
- 从最低位向右找到第一个
四、补码的加减运算
1. 运算规则
- 符号位参与运算,运算结果自动取模。
- 加法: [ A + B ] 补 = [ A ] 补 + [ B ] 补 m o d 2 n + 1 [A + B]_{补} = [A]_{补} + [B]_{补} \mod 2^{n+1} [A+B]补=[A]补+[B]补mod2n+1
- 减法: [ A − B ] 补 = [ A ] 补 + [ − B ] 补 m o d 2 n + 1 [A - B]_{补} = [A]_{补} + [-B]_{补} \mod 2^{n+1} [A−B]补=[A]补+[−B]补mod2n+1
2. 示例:补码减法( 7 − 5 → 7 + ( − 5 ) 7 - 5 \rightarrow 7 + (-5) 7−5→7+(−5))
-
7的补码 = 00111
,
-5的补码 = 11011
\text{7的补码 = 00111}, \quad \text{-5的补码 = 11011}
7的补码 = 00111,-5的补码 = 11011
00111 + 11011 = 100010 ( 舍弃溢出位 ) = 00010 ( 十进制 2 ✓ ) \begin{aligned} 00111 &+ 11011 \\ &= 100010 \quad (\text{舍弃溢出位}) \\ &= 00010 \quad (\text{十进制 } 2\ \checkmark) \end{aligned} 00111+11011=100010(舍弃溢出位)=00010(十进制 2 ✓)
五、溢出检测
1. 双符号位法(变形补码)
- 溢出条件:若结果符号位为
01
(正溢出)或10
(负溢出)。 - 逻辑电路:溢出信号由两位符号位的异或产生。
2. 进位判断法
- 溢出公式:
O V R = C s ⊕ C s − 1 OVR = C_s \oplus C_{s-1} OVR=Cs⊕Cs−1
(符号位进位 C s C_s Cs 与次高位进位 C s − 1 C_{s-1} Cs−1 的异或)
六、补码与移码的关系
1. 移码定义
- 用于浮点数阶码,对补码符号位取反:
[ X ] 移 = [ X ] 补 ± 2 n [X]_{移} = [X]_{补} \pm 2^n [X]移=[X]补±2n,或直接偏置为无符号数。
2. 比较补码与移码
七、练习题巩固
- 转换补码:
- 将十进制 − 28.75 -28.75 −28.75 转换为 IEEE 754 单精度浮点数(补码格式)。
- 计算溢出:
- 若使用 8 位补码计算 100 + 50 100 + 50 100+50,是否溢出?
- 补码求和:
- [ X ] 补 = 1.1011 , [ Y ] 补 = 0.1101 [X]_{补} = 1.1011, [Y]_{补} = 0.1101 [X]补=1.1011,[Y]补=0.1101,求 [ X + Y ] 补 [X + Y]_{补} [X+Y]补。
答案提示
- 补码转换:
- 单精度浮点数符号位
1
(负数),阶码偏移后计算为 131 131 131(10000011
),尾数为 1.1110011000... 1.1110011000... 1.1110011000...。
- 单精度浮点数符号位
- 溢出判断:
100 + 50 = 15 0 10 100 + 50 = 150_{10} 100+50=15010,8位补码范围 [ − 128 , 127 ] [-128, 127] [−128,127],因此溢出。 - 补码加法:
1.1011 + 0.1101 = 10.1000 1.1011 + 0.1101 = 10.1000 1.1011+0.1101=10.1000,丢弃高位后为0.1000
(符号位溢出需处理)。
通过结合理论与实际运算示例,补码的核心思想得以体现:统一加减法操作,简化电路设计,同时在数字表示和运算效率之间找到平衡。
2.1.5反码表示法
反码是一种带符号数的表示方法,与补码的转换密切相关。以下是其核心定义、特性、转换步骤及流程图。
一、反码的定义
1. 纯整数的反码
对于长度为
n
+
1
n+1
n+1 位(1位符号位
n
n
n 位数值位)的整数,其反码定义为:
[
X
]
反
=
{
X
若
0
≤
X
<
2
n
(
2
n
+
1
−
1
)
+
X
若
−
2
n
<
X
≤
0
[X]_反 = \begin{cases} X & \text{若 } 0 \leq X < 2^n \\ (2^{n+1} - 1) + X & \text{若 } -2^n < X \leq 0 \end{cases}
[X]反={X(2n+1−1)+X若 0≤X<2n若 −2n<X≤0
示例(5位整数):
-
X
=
−
5
10
X = -5_{10}
X=−510,
n
=
4
n=4
n=4
[ X ] 反 = 2 5 − 1 + ( − 5 ) = 1111 1 2 − 010 1 2 = 1101 0 2 [X]_反 = 2^{5} - 1 + (-5) = 11111_2 - 0101_2 = 11010_2 [X]反=25−1+(−5)=111112−01012=110102
2. 纯小数的反码
对于小数
X
=
X
s
.
X
1
X
2
.
.
.
X
n
X = X_s.X_1X_2...X_n
X=Xs.X1X2...Xn(符号位
X
s
X_s
Xs),反码定义为:
[
X
]
反
=
{
X
若
0
≤
X
<
1
2
−
2
−
n
+
X
若
−
1
<
X
≤
0
[X]_反 = \begin{cases} X & \text{若 } 0 \leq X < 1 \\ 2 - 2^{-n} + X & \text{若 } -1 < X \leq 0 \end{cases}
[X]反={X2−2−n+X若 0≤X<1若 −1<X≤0
示例(4位小数):
-
X
=
−
0.101
1
2
X = -0.1011_2
X=−0.10112
[ X ] 反 = 1.111 1 2 − 0.101 1 2 = 1.010 0 2 [X]_反 = 1.1111_2 - 0.1011_2 = 1.0100_2 [X]反=1.11112−0.10112=1.01002
二、反码的转换流程
流程图(Mermaid表示):
步骤说明:
- 判断符号:若数值为正数,符号位为0;若为负数,符号位为1。
- 处理数值位:
- 正数:保留数值位二进制原样。
- 负数:符号位保持1,数值位逐位取反(0→1,1→0)。
- 合成反码:合并符号位与处理后的数值位。
示例转换(-13的8位反码):
- 正数原码:
0000 1101
- 负数原码:
1000 1101
- 反码转换:符号位1,数值位取反 →
1111 0010
即11110010
三、反码的核心特性
特性 | 描述 |
---|---|
符号位处理 | 符号位单独处理,不参与数值运算 |
零的表示 | 存在两种零:+0 → 00000000 , -0 → 11111111 |
表示范围 | 与原码对称,例如8位整数范围为 -127 ~ 127,无法表示 -128 (补码可多表示一个数) |
加减法规则 | 需处理循环进位:若最高位有进位,则加到最低位。例如 1 + (-1): 0001 + 1110 = 1111 → 0000(实际应为0,需循环进位) |
应用场景 | 现代计算机中较少使用,通常作为补码转换的中间步骤 |
四、与原码、补码的对比
特征 | 原码 | 反码 | 补码 |
---|---|---|---|
符号位处理 | 符号位独立判断 | 符号位独立判断 | 符号参与运算 |
零的表示 | ±0 双零 | ±0 双零 | 0唯一表示 |
表示范围(8位) | -127 ~ +127 | -127 ~ +127 | -128 ~ +127 |
运算复杂度 | 加减法需符号处理 | 加减法需循环进位 | 加减法统一加法实现 |
硬件实现 | 复杂 | 较复杂 | 简单 |
五、典型例题
例题1:将 -7 转换为8位反码
- 原码:
10000111
- 反码:符号位1,数值位取反 →
11111000
例题2:计算 3 + (-3)(4位反码)
3 → 0011
,-3反码 → 1100
- 相加:
0011 + 1100 = 1111
(即-0
)
总结
反码虽因双零问题和运算复杂性被补码取代,但其在理解数值编码发展过程中意义重大。其核心思想是 符号位固定,数值位取反,适合作为补码运算的中间步骤。
2.1.6 3种机器数的比较与转换
一、核心特性对比
特征 | 原码 | 补码 | 反码 |
---|---|---|---|
符号位处理 | 符号位独立,单独判断 | 符号位视为数值位,参与运算 | 符号位单独处理 |
零的表示 | ±0 各一个(如 0000 和 1000 ) | 唯一零(0000 ) | ±0 各一个(如 0000 和 1111 ) |
数值范围(8位) | -127 ~ +127 | -128 ~ +127 | -127 ~ +127 |
加减法实现 | 需判断符号位,运算复杂 | 统一为加法实现,无符号判断 | 需循环进位(进位加到最低位) |
应用场景 | 早期硬件/数学直观理解 | 现代计算机通用设计(效率高) | 过渡方案,偶用于特定运算 |
二、转换规则与流程
1. 真值 → 机器数
-
原码:符号位 X = − 5 10 ⇒ [ X ] 原 = 1000010 1 2 X = -5_{10} \Rightarrow [X]_原 = 10000101_2 X=−510⇒[X]原=100001012
X = + 0.37 5 10 ⇒ [ X ] 原 = 0.01 1 2 X = +0.375_{10} \Rightarrow [X]_原 = 0.011_2 X=+0.37510⇒[X]原=0.0112 -
补码:
- 正数:与原码相同。
- 负数:原码符号位不变,数值位取反加1(快捷法:从最低位开始保留第一个1及后的0,其余取反)。
示例:
X = − 5 10 ⇒ [ X ] 补 = 1111101 1 2 X = -5_{10} \Rightarrow [X]_补 = 11111011_2 X=−510⇒[X]补=111110112
X = − 0.10 1 2 ⇒ [ X ] 补 = 1.01 1 2 X = -0.101_2 \Rightarrow [X]_补 = 1.011_2 X=−0.1012⇒[X]补=1.0112
-
反码:
- 正数:与原码相同。
- 负数:符号位不变,数值位逐位取反。
示例:
X = − 5 10 ⇒ [ X ] 反 = 1111101 0 2 X = -5_{10} \Rightarrow [X]_反 = 11111010_2 X=−510⇒[X]反=111110102
2. 机器数之间的转换
转换要点:
- 补码与反码的互转:补码减1即为反码。
- 原码转补码:符号位不变,数值取反加1。
- 直接由真值转补码(无需原码):负数直接应用快捷法(从最低位保留第一个1,左侧取反)。
三、典型例题
例1:将 X = − 7 10 X = -7_{10} X=−710 转换为8位原码、反码、补码。
- 原码:
10000111
- 反码:
11111000
(数值取反) - 补码:
11111001
(反码+1)
例2:计算补码加法 7 + ( − 5 ) 10 7 + (-5)_{10} 7+(−5)10(8位)。
- 7 补 = 00000111 7_{补} = 00000111 7补=00000111
- − 5 补 = 11111011 -5_{补} = 11111011 −5补=11111011
- 加法结果:
00000111 - 11111011 --- 100000010 → 舍去溢出高位 → 00000010(十进制2✓)
四、关键流程图示
五、数值范围与溢出
- 补码优势:唯一可表示最小数(对称性打破),如8位整数补码可表-128。
- 溢出检测:符号位+次高位进位是否冲突(
01
正溢出,10
负溢出)。
通过理解三种机器数的转换规则及对比,能更深入掌握计算机处理带符号数的底层逻辑。