6502 Wozniak and Rankin浮点例程:格式转换与原理咨询
Wozniak-Rankin 6502浮点格式解析与问题解答
格式结构拆解
该浮点格式为4字节(32位),各部分定义清晰:
- 字节0:最高位是全局符号位(
S,0=正,1=负),剩余7位是偏移指数(EEEEEEE),偏移量固定为64,即实际指数 = 存储的7位指数值 - 64。 - 字节1-3:组成带符号的尾数,结构为
SM.MMMMMM MMMMMMMM MMMMMMMM:- 字节1最高位是尾数符号位(
S),第二位是尾数的整数位(M),剩余6位是小数部分的高6位; - 字节2、3各8位,是小数部分的剩余16位。
- 字节1最高位是尾数符号位(
规格化非零数要求尾数的整数位必须为1,因此正尾数范围是[1.0, 2.0),负尾数范围是(-2.0, -1.0]。
尾数范围为何是1.到2.?
这是规格化浮点数的标准设计:
- 规格化强制尾数整数位为1,确保每个非零数的表示唯一,避免冗余(比如
0.1×2^2和1.0×2^1是同一个值,规格化后统一为后者)。 - 二进制下,
1.xxxxxx...的数值必然落在1.0(含)到2.0(不含)之间——小数点后全1时为1.111...1,等于2.0 - 1/2^22,刚好小于2.0。
特定尾数的数值验证
- 字节1为
01000000(二进制):
尾数符号位为0(正),整数位为1,剩余位全0,结合字节2、3全0的话,尾数就是1.000000...,即**+1.0**,你的判断正确。 - 字节1为
11000000(二进制):
尾数符号位为1(负),整数位为1,剩余位全0,对应尾数是-1.000000...。从补码规则看,+1.0的尾数表示是01000000 00000000 00000000,对其取反加1后得到11000000 00000000 00000000,完全匹配,所以确实是补码表示的-1.0。
示例:将3.14转换为该格式
步骤如下:
- 规格化二进制转换:
3.14的二进制近似值为11.0010001111010111000011,规格化后为1.10010001111010111000011 × 2^1。 - 确定符号位与指数:
- 3.14为正数,字节0的全局符号位
S=0; - 实际指数为1,偏移64后存储值为
1+64=65,二进制为1000001,因此字节0为01000001(十六进制0x41)。
- 3.14为正数,字节0的全局符号位
- 生成尾数字节:
规格化尾数的小数部分为10010001111010111000011,取前22位用于格式存储:- 字节1:尾数符号位0 + 整数位1 + 前6位小数
100100→ 二进制01100100(十六进制0x64); - 字节2:接下来8位小数
01111010→ 十六进制0x7A; - 字节3:最后8位小数
11100001→ 十六进制0xE1。
- 字节1:尾数符号位0 + 整数位1 + 前6位小数
- 最终结果:
4字节十六进制为0x41 0x64 0x7A 0xE1,二进制为01000001 01100100 01111010 11100001。
内容的提问来源于stack exchange,提问作者Justin van Zyl
相关产品推荐
相关产品推荐

