浮点数 阶码 + 尾数 转换动画

软考 · 计算机组成原理 | 数据表示 | 从零讲懂「阶码 + 尾数」,再点「下一步」看它怎么拼出来

⓪ 先看全貌:格式 + 完整流程速查(背下来就能做题)

本页格式:共 11 位 = 阶码区 4 位 + 尾数区 7 位。

┌─────────────┬─────────────────┐ │ 阶码区 │ 尾数区 │ │ 4 位 │ 7 位 │ ├──────┬──────┼────────┬─────────┤ │ 阶符 │ 阶码 │ 数符 │ 小数位 │ │ 1 位 │ 3 位 │ 1 位 │ 6 位 │ └──────┴──────┴────────┴─────────┘ 阶码的符号 阶码大小 数的符号 尾数去掉 0. 后

完整计算流程(5 步)——设要算真值 X:

步骤做什么例子(X = 5.25)
1十进制 → 二进制
整数:除2取余倒着读|小数:乘2取整顺着读
5.25 → 101.01
2规格化:挪小数点成 0.1xxx
挪几位,阶码 E 就是几
0.10101 × 2³,E=3
3算阶码:E + 8 后转 4 位二进制
不够 4 位左边补 0(偏移量恒为 8)
3+8=11 → 1011
4算尾数:数符 + 小数部分
正0负1;小数不够 6 位右边补 0
0 + 101010 = 0101010
5两段拼起来1011 0101010

补 0 往哪边?一句话:小数右补、整数左补(往"权值小、不影响数值"的那边补)。

要补的部分方向为什么
二进制小数、尾数小数位右补(末尾)右边权值趋近 0(1/64…),补 0 不加值
二进制整数、阶码转位左补(最前)左边是高位,补 0 只补位不加值
反例(补错方向会变值): 小数 0.10101 补6位 → 右补 0.101010 = 0.65625 ✓ | 左补 0.010101 = 0.328125 ✗ 整数 5 补8位 → 左补 00000101 = 5 ✓ | 右补 10100000 = 160 ✗
顺带复习:原码 / 反码 / 补码(8 位 = 1 符号 + 7 数值) 符号位:0 正 1 负
码制正数负数
原码符号0 + 绝对值符号1 + 绝对值
反码原=反=补(不变)数值位取反,符号位仍为 1 ⚠️
补码原=反=补(不变)反码末位 +1
例 -45:原 1 0101101 → 反 1 1010010 → 补 1 1010011
⚠️ 取反是「数值位取反」,符号位不动!

① 其实你早就会了:科学计数法

中学学过的科学计数法,就是浮点数的“祖先”:

12345 = 1.2345 × 10⁴ └──┬──┘ └┬┘ 尾数 指数

它的好处是:不管数多大、多小,都能写成“一个小数 × 10 的几次方”。

0.00002 = 2 × 10⁻⁵ 888000000 = 8.88 × 10⁸

浮点数,就是“二进制版的科学计数法”。公式只有一个:

N = 尾数 × 2阶码
十进制乘 10 的几次方,二进制就乘 2 的几次方 —— 仅此区别

② 为什么非得用它?定点数不够用

你在上一页学的定点数,小数点是钉死的。它像一根只有 8 格的尺子:

0 . 1 1 0 0 0 0 0 → 最大只能表示 0.1111111₂ ≈ 0.99

结果就是:量不了 888 这种大数,也量不了 0.00002 这种小数,一算就“装不下”(溢出)。

浮点数的思路是:让小数点可以移动(浮动的点 → 浮点数)。小数点往左移几位,指数就加几,数值不变,但能覆盖的范围一下子变得极大极小。

③ 四个格子,分别装什么

一个浮点数,拆成 4 段(下面是本页用的 11 位示例,先看结构、别管细节):

┌────┬────────┬────┬──────────┐ │阶符 │ 阶码 │数符 │ 尾数 │ └────┴────────┴────┴──────────┘ 指数 指数 数字 数字 的符号 的大小 的符号 的位数

其实就是把科学计数法搬过来:

科学计数法里的对应格子负责什么
10 的 指数阶符 + 阶码范围:能表示多大 / 多小
尾数(1.2345 那部分)数符 + 尾数精度:有效数字有几位
🔑 必背口诀:阶码管范围,尾数管精度。
指数越大 → 数越大(范围靠它撑);尾数位数越多 → 有效数字越多(精度靠它给)。

④ 什么叫“规格化”?(最容易懵的一步)

科学计数法里,12345 能写出无数种形式,它们全都相等:

1.2345 × 10⁴ ← 小数点后第一位是有效数字 ✅ 0.12345 × 10⁵ ← 第一位是 0,白占位置 ❌ 12.345 × 10³ ← 小数点前有两位 ❌

问题来了:同一个数这么多写法,计算机到底存哪一种? 乱套了。

所以定一个唯一标准写法:让小数点后面第一位必须是有效数字。这个“调成唯一标准写法”的动作,就叫 规格化。

🔑 规格化的两个目的:
1️⃣ 同一个数只有 一种 写法,不会乱;
2️⃣ 0 不白占位子,尾数每一格都用来装有效数字,榨干精度。
停下来自查: ① 浮点里哪个部分决定“能表示多大的数”?哪个决定“多精确”? ② 0.056 × 10³ 是规格化写法吗?为什么?
点击看答案
① 阶码管范围(能多大/多小),尾数管精度(有效数字几位)。
② 不是。小数点后第一位是 0,白占了位置。应改写成 5.6 × 10¹(第一位变成有效数字 5)。

上面的道理都懂了吗?懂了就点下面的按钮,我们进入二进制世界,看 5.25 这种数是怎么一步步变成 阶码 + 尾数 的 👇

一句话:浮点数 = 尾数 × 2阶码,形态是 阶符 阶码 + 数符 尾数。 阶码管范围(能表示多大),尾数管精度(有效数字多长)。 本页采用 4 位阶码(移码,偏移 8) + 7 位尾数(补码:1 数符 + 6 小数),共 11 位。

⑤ 二进制版规格化长啥样(看懂就能做所有题)

二进制的有效数字只有 0 和 1,「有效数字」就是 1。所以二进制规格化的规则特别干脆:

🔑 把小数点挪到「最左边那个 1」的前面(即挪成 0.1xxx 形态),挪了几位,阶码就是几。

注意:0.1xxx 要同时满足 ①小数点前没有数字 且 ②小数点后第一位是 1,两个条件缺一不可。

拿 5.25 演示,全程两件事:①整数小数各转二进制 ②挪小数点。

第一步 · 转二进制 整数 5 → 101 (5 = 4 + 1 = 101₂) 小数 0.25 → .01 (0.25 × 2 = 0.5 → 0;0.5 × 2 = 1.0 → 1) 合起来: 5.25 = 101.01₂ 第二步 · 挪小数点,直到变成 0.1xxx 101.01 原样 10.101 × 2¹ 左移 1 位 1.0101 × 2² 左移 2 位 0.10101 × 2³ ✅ 左移 3 位 —— 小数点前终于没数字、且小数点后第一位是 1(0.1xxx)!

⚠️ 别被 10.101 骗了:它小数点后第一位已经是 1,但小数点前还有 10,所以 不算规格化,要继续挪。只看"小数点后第一位"会在这里早停!

停下来:0.10101 × 2³ 就等于 5.25(把小数点移回去验证一下:0.10101 右移 3 位 = 101.01 = 5.25 ✓)。

🔑 于是得到两个关键值:阶码 E = 3、尾数 = 0.10101。接下来只要把这两个值「塞进格子」——这就是下面动画干的事。
动手试一个: 42 的阶码和尾数分别是多少?(提示:42 = 101010₂)
点击看答案
42 = 101010₂(整数,没有小数部分)。小数点本来在最右边:
101010 → 10101.0 ×2¹ → 1010.10 ×2² → 101.010 ×2³ → 10.1010 ×2⁴ → 1.01010 ×2⁵ → 0.101010 ×2⁶ ✅
所以 阶码 E = 6,尾数 = 0.101010。(在动画里选 +42 可按步核对)

⑥ 下面这个动画怎么用

选一个真值,然后一直点 下一步,它会带你走完这 6 步:

步骤在做什么对应上面哪个道理
① 十进制→二进制算出 101.01 这种形式⑤ 第一步
② 规格化挪小数点成 0.10101 × 2³⑤ 第二步
③ 求阶码把 E=3 用「移码」写成 4 位 0/1阶码管范围
④ 求尾数把 0.10101 用「补码」写成 7 位 0/1尾数管精度
⑤ 拼起来阶码 + 尾数 = 11 位 0/1③ 的四个格子
⑥ 反向校验读回去看等不等于原数验收

⚠️ 两个“反例”按钮特别看:+0.1(尾数 6 位装不下 → 舍入,有误差)和 +200(阶码装不下 → 溢出)。

选一个真值:
真值 +5.25 = 101.01₂
阶码 移码 · 偏移 8 · 4 位
尾数 补码 · 1 数符 + 6 小数 · 7 位

📐 判断一个尾数是否“规格化” 最常考

规格化 = 尾数绝对值 ∈ [0.5, 1)

补码尾数的判断口诀

➕ 浮点数运算:对阶 → 尾数加减 → 规格化 大题步骤

  1. 对阶:两数阶码不同,令阶差 K = 大阶 − 小阶,把阶小的数尾数右移 K 位、阶码加 K(小阶向大阶看齐)。右移会丢低位 → 有精度损失。
  2. 求尾数和/差:此时阶码已对齐,直接对尾数做加减。
  3. 结果规格化:若尾数溢出(绝对值 ≥ 1)→ 右规(尾数右移 1 位、阶码 +1);若非规格化 → 左规(尾数左移、阶码减)。同时判阶码是否溢出。
  4. 舍入:处理右移/右规丢掉的低位(0 舍 1 入等)。
  5. 溢出判断:以阶码为准 —— 阶码上溢 → 结果溢出(无穷);阶码下溢 → 结果当 0。

🏭 IEEE 754 单精度(1 + 8 + 23) 例 1.5:176.0625

0 10000110 01100000001000000000000
① 176.0625 = 10110000.0001₂
② 规格化:1.01100000001 × 2⁷(隐含小数点前那位 1,即尾数 = 1.xxx)
③ 阶码 = 指数 + 偏移量 127 → 7 + 127 = 134 = 10000110₂(注意:用 127 不是 128)
④ 尾数去掉隐含的 1,补足 23 位 → 01100000001 0000000000000

IEEE 754 三种格式

参数单精度双精度扩充精度
总字长326480
符号位 S111
指数长度 E81115
尾数长度 P235264
指数偏移量+127+1023+16383
可表示范围10⁻³⁸~10³⁸10⁻³⁰⁸~10³⁰⁸10⁻⁴⁹³²~10⁴⁹³²