问得好!真值 是理解移码概念的关键。让我详细解释:
一、真值的定义
真值 = 我们想要表示的实际数值(在数学意义上的值)
示例
- 如果我们想表示数字 -3,那么 -3 就是真值
- 如果我们想表示数字 +5,那么 +5 就是真值
- 如果我们想表示温度 -10°C,那么 -10 就是真值
真值就是原始的真实数值,还没有经过任何编码转换。
二、移码公式详解
移码公式:
\\text{移码编码} = \\text{真值} + \\text{偏移量(bias)}
其中:偏移量通常取 (2^{n-1})(n是总位数)
为什么要加偏移量?
目的是将所有真值转换为非负数,便于比较大小。
三、具体例子(n=8位)
已知条件
- 总位数 n = 8
- 偏移量 = (2^{7} = 128)
- 移码编码范围:0 到 255(无符号8位)
例1:真值 = -128
\\text{移码} = -128 + 128 = 0
二进制移码:00000000
例2:真值 = -64
\\text{移码} = -64 + 128 = 64
二进制移码:01000000
例3:真值 = 0
\\text{移码} = 0 + 128 = 128
二进制移码:10000000
例4:真值 = +127
\\text{移码} = 127 + 128 = 255
二进制移码:11111111
四、移码与补码的关系
重要关系:移码 = 补码的符号位取反
| 真值 | 补码(8位) | 移码(偏移128) | 关系 |
|---|---|---|---|
| -128 | 10000000 | 00000000 | 符号位1→0 |
| -64 | 11000000 | 01000000 | 符号位1→0 |
| 0 | 00000000 | 10000000 | 符号位0→1 |
| +64 | 01000000 | 11000000 | 符号位0→1 |
| +127 | 01111111 | 11111111 | 符号位0→1 |
硬件实现:移码和补码转换只需翻转最高位(符号位)!
五、为什么用移码?浮点数指数的例子
IEEE 754 单精度指数部分
- 8位指数,偏移量 = 127(不是128!因为n=8,但偏移是127)
- 真值范围:-126 到 +127
- 移码范围:1 到 254(0和255保留给特殊值)
示例:指数真值 = -1
\\text{移码} = -1 + 127 = 126
存储为:01111110
优势:直接比较移码值就能知道指数大小
- 移码 126(真值-1)< 移码 128(真值+1)
- 无需处理符号,直接按无符号数比较
六、不同偏移量的选择
| 偏移量 | 特点 | 应用 |
|---|---|---|
| (2^{n-1}) | 真值范围对称:[-2^{n-1}, 2^{n-1}-1] | 理论分析 |
| (2^{n-1}-1) | IEEE 754使用(8位时127) | 浮点数指数 |
| 其他值 | 根据需求调整 | 特殊应用 |
为什么IEEE用127而不是128?
- 为了保留全0和全1编码给特殊值(0=非规格化,255=无穷大/NaN)
- 实际指数范围:-126到+127
七、从移码还原真值
还原公式:
\\text{真值} = \\text{移码编码} - \\text{偏移量}
示例(8位,偏移128)
- 移码
00000000= 0\\text{真值} = 0 - 128 = -128
- 移码
10000000= 128\\text{真值} = 128 - 128 = 0
- 移码
11111111= 255\\text{真值} = 255 - 128 = +127
八、与其它编码对比
| 概念 | 真值 = -8(4位时) | 编码值 | 特点 |
|---|---|---|---|
| 真值本身 | -8 | -8(数学值) | 原始值 |
| 原码 | 无法表示 | 无 | 范围只到-7 |
| 反码 | 无法表示 | 无 | 范围只到-7 |
| 补码 | -8 | 1000(二进制) | 能表示 |
| 移码(偏移8) | -8 | 0000(-8+8=0) | 转换为非负 |
注意:4位移码偏移量是 (2^{3}=8),不是IEEE的127。
九、常见误区澄清
误区1:移码的真值范围和补码不同?
正确 :范围相同!都是 [-2^{n-1}, 2^{n-1}-1]
只是编码方式不同。
误区2:偏移量总是2^{n-1}?
不一定!IEEE 754中:
- 单精度(8位指数):偏移127
- 双精度(11位指数):偏移1023
误区3:移码能避免溢出?
不能 !移码只是编码方式,运算仍可能溢出。
但移码便于比较大小,这是它的主要优势。
十、形象理解
想象一个数轴平移:
真值数轴:
... -3 -2 -1 0 +1 +2 +3 ...
↓ ↓ ↓ ↓ ↓ ↓ ↓ (向右平移128)
移码数轴:
... 125 126 127 128 129 130 131 ...
所有负数都变成了正数,0移到了中间位置。
总结
真值 就是原始的实际数值,移码通过加上一个固定偏移量将真值映射到无符号数范围,从而:
- 消除符号:所有编码都是非负数
- 便于比较:直接按无符号比较即可得大小关系
- 保持顺序:真值的大小顺序在移码中保持不变
记住这个核心:
\\text{移码} = \\text{真值} + \\text{bias}
\\text{真值} = \\text{移码} - \\text{bias}
这是浮点数指数表示的基础,也是理解IEEE 754的关键!