1内容
下面用中文把 原码 ( sign-magnitude )、 反码 ( one’s complement )、 补码 ( two’s complement )、 移码 ( bias / excess / offset binary )分别“用来干什么”、为什么出现、各自擅长什么,并用同一组 8 位 ( 8-bit )具体数值例子对比。
1. 核心用途
- 目的:用一个最高位当 符号位 ( sign bit ),“直观”表达正负。
- 本质:把“符号”和“大小”分开存:
$$
\text{value} = (-1)^{s}\cdot \text{magnitude}
$$
其中 符号位 $s=b_7$,幅值 $\text{magnitude}=\sum_{i=0}^{6} b_i 2^i$。
1. 核心用途
- 目的:让“负数”能由“正数”通过 逐位取反 ( bitwise invert )得到,构造对称编码。
- 规则:
- 若 MSB =0:正常二进制
- 若 MSB =1:其数值等于“取反后当无符号得到的幅值”的负数
$$
x<0 \Rightarrow \text{bits}(x)=\sim \text{bits}(|x|)
$$
3. 8 位具体数值示例(强对比)
例 1:把 -5 编成 8 位补码
- +5:00000101
- 取反:11111010
- 加 1:11111011
- 所以:11111011(补码)= -5
验证(用公式):$U=\text{int}(11111011_2)=251$
$$
251-256=-5
$$
例 2:最小值 -128
$$
128-256=-128
$$
这也是你在作业里看到 10000000 在补码里是 -128 的原因。
1. 核心用途
- 目的:把“有符号数”整体平移成“全是非负的无符号数”,这样:
- 比较大小可以直接用 无符号比较器 ( unsigned comparator )
- 特别适合 浮点数指数 ( floating-point exponent )存储(IEEE 754 就这么干)
- 定义:选一个 偏置 ( bias )$B$
$$
\text{stored} = x + B \quad\Longleftrightarrow\quad x = \text{stored} - B
$$
2. 典型场景:浮点数指数(exponent)
比如 8 位移码常用偏置 $B=127$(因为 $2^{7}-1=127$),这就是你在浮点题里会遇到的那种。
3. 8 位具体数值示例(取 bias=127)
$$
\text{stored}=0+127=127
$$
127 的 8 位二进制:01111111
$$
\text{stored}=5+127=132
$$
132 的 8 位:10000100
$$
\text{stored}=-5+127=122
$$
122 的 8 位:01111010
55) 一句话对比总结(带用途)
- 原码 :最直观的“符号位 + 幅值”,但运算麻烦、存在 ±0 。
- 反码 :负数=取反,仍有 ±0 ,加法要处理 回卷进位 。
- 补码 :为“统一加法器做加减”而生,只有一个 0,现代整数标准。
- 移码 :为“把有符号量变成可无符号比较/排序的编码”而生,典型用于 浮点指数 。
如果你把作业后面 浮点数 ( floating-point )那题贴出来,我可以把 移码指数 、 尾数 ( mantissa/significand )、 规格化 ( normalization )用同样的“具体数值”方式串起来讲清楚。