/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
第〇节 · 扫盲(一句人话)
浮点数就是计算机的"科学计数法"。类比:用 1.23 × 10⁵ 表示一个很大或很小的数时,5 叫阶码(决定小数点位置)、1.23 叫尾数(决定精度)。IEEE 754 就是把这两部分和符号位,按固定位数塞进 32 位或 64 位里。坑主要在三处:尾数藏着个"隐含的 1"、阶码 0 和全 1 有特殊含义、浮点"溢出"看的是阶码不是尾数。
一、为什么用"阶码 + 尾数"
浮点数 = 基数² × 阶码 × 尾数(基数通常取 2)。把数值范围(靠阶码)和表示精度(靠尾数)解耦,才能同时表示极大和极小的数。
-
规格化:尾数的最高位(整数部分)固定为 1,这个 1 不存储,叫隐含位——省 1 位换来多 1 位精度。
-
真值公式(规格化):(−1)ˢ × (1 + M) × 2ᴱ⁻偏置。
⚠️ 隐含位 1 不能忘!算完阶码一定要还原 1.M,否则数量级直接错(2022 年 −0.4375 题就是典型)。
二、IEEE 754 位域与真值公式
| 单精度(32 位) | 1 | 8 | 23 | 127 | E − 127 |
| 双精度(64 位) | 1 | 11 | 52 | 1023 | E − 1023 |
-
有效位(含隐含位):单精度 24 位、双精度 53 位。
-
真值(规格化):(−1)ˢ × (1 + M) × 2ᴱ⁻偏置。
三、阶码的特殊取值(必背)
| E=0 且 M=0 | ±0 |
| E=0 且 M≠0 | 非规格化数(无隐含 1,阶取 1−偏置,平滑下溢) |
| 1 ≤ E ≤ 254(单) | 规格化数 |
| E=全 1 且 M=0 | ±∞ |
| E=全 1 且 M≠0 | NaN(非数) |
范围(单精度):
-
最大规格化正数 = (2 − 2⁻²³) × 2¹²⁷ = 2¹²⁸ − 2¹⁰⁴
-
最小规格化正数 = 1.0 × 2⁻¹²⁶
⚠️ 阶码全 0 时不是阶码 −127 的规格化数,而是非规格化(阶取 −126、无隐含 1)。如 2023 年 80200000H。
—— IEEE 754 位域拆分与阶码特殊取值
四、真题手算(一):真值 → 机器数
【408 真题 2011(13)】 float x = −8.25,FR1 内容是?
-
−8.25 = −1000.01B = −1.00001 × 2³。
-
S=1;E−127=3 → E=130=1000 0010B;尾数隐含 1,尾数位写 0000100…0。
-
整体 1100 0001 0000 0100 0000…0 = C1040000H。
-
答案:A(易误选 D——漏了隐含位)。
【408 真题 2022(14)】 −0.4375 的单精度表示?
-
−0.4375 = −0.0111B = −1.11 × 2⁻²。
-
E−127 = −2 → E=125=0111 1101B;尾数 1100…0。
-
整体 1 0111 1101 1100…0 = BDC0 0000H。
五、真题手算(二):机器数 → 真值
【408 真题 2023(14)】 x 机器数 8020 0000H,值?
-
8020 0000H = 1000 0000 0010 0000…0B。S=1(负);E=00000000(=0),M≠0 → 非规格化,阶取 −126、无隐含 1。
-
真值 = −0.01 × 2⁻¹²⁶ = −2⁻¹²⁸。答案:A。
【408 真题 2018(14)】 单精度最小规格化正数?
-
S=0;E 取最小 1(真值 1−127=−126);M 全 0 → 1.0 × 2⁻¹²⁶。答案:A。
【408 真题 2012(14)】 单精度能表示的最大正整数?
-
1.111…1 × 2²⁵⁴⁻¹²⁷ = 2¹²⁷ × (2 − 2⁻²³) = 2¹²⁸ − 2¹⁰⁴。答案:D。
【408 真题 2025(13)】 x 机器数 4730 0000H,值?
-
0100 0111 0011 0000…0B。S=0;E=1000 1110=142,真值 15;M=011…0 → 1 + 0.25 + 0.125 = 1.375。
-
值 = 1.375 × 2¹⁵。答案:D。
六、真题手算(三):精确表示与多类型解读
【408 真题 2021(14)】 不能用 IEEE 754 精确表示的是?
-
1.25=1.01×2⁰、2.0=1.0×2¹、2.5=1.01×2¹ 都可精确;1.2 二进制无限循环(1.001100110011…),无法精确表示。答案:A。
【408 真题 2020(13)】 x 机器数 C800 0000H,x 可能是?
-
若按 int(补码):符号位 1,取反加 1 得 −939524096。
-
若按 float:S=1、E=10010000=144(真值 17)、M=0 → −1.0×2¹⁷ = −131072。
-
同一串二进制,两种类型解读出两个合法值。答案:A。
七、浮点数加减运算:五步法
对阶 → 尾数加减 → 规格化 → 舍入 → 判溢出
│ │ │ │ │
小阶对大阶 补码/原码 左/右规 就近舍入 阶码超范围
尾数右移 求和 末位补1 (0舍1入) 则溢出
对阶:小阶向大阶对齐,尾数右移(阶码每 +1,尾数右移 1 位)。对阶不引起阶码上/下溢。
尾数加减:对齐后尾数相加减。
规格化:左规(尾数左移、阶码−1,可能下溢);右规(尾数右移、阶码+1,可能上溢)。
舍入:右规/舍入可能使阶码再 +1,故可能上溢。
判溢出:看阶码是否超出范围。
—— 浮点加减五步法流程
八、真题手算(四):浮点加减
【408 真题 2009(13)】 X=2⁷×29/32、Y=2⁵×5/8,X+Y 结果?
-
对阶后 Y 尾数右移,与 X 尾数相加需右规;右规后阶码符号位 01 → 阶码上溢(阶码 8 超 5 位补码最大 7)。答案:D(溢出)。
【408 真题 2015(14)】 关于浮点加减,正确的是?
-
Ⅰ 对阶不引起阶码上/下溢 ✓;Ⅱ 右规和舍入都可能上溢 ✓;Ⅲ 左规可能下溢 ✓;Ⅳ 尾数溢出仅误差、结果未必溢出 ✓。答案:D(全对)。
九、溢出的判据:看阶码,不看尾数
⚠️ 浮点"溢出"看阶码、不看过大的尾数。尾数溢出只产生误差,结果不一定溢出。对阶、左规、右规、舍入每一步都可能改阶码,右规和舍入都可能把阶码推到上溢。
十、运算电路:加法器 / ALU / 乘法器
| 半加器 | 无进位输入,输出和 S、进位 C |
| 全加器 | 含低位进位 Cᵢ,输出 Sᵢ、Cᵢ₊₁ |
| 串行进位加法器 | 进位逐位传,慢 |
| 超前进位加法器 | 进位并行生成,快 |
| ALU | 受操作码控制,完成加/减/与/或/异或;减法 = 加 + 取反 + 进位 1 |
| 阵列乘法器 | 纯硬件并行,一周期完成乘法(面积大) |
| 串行乘法器 | ALU+移位器循环,多周期(省面积) |
⚠️ 无硬件乘法器时,编译器可把 a*b 编译成循环移位加法(Booth / shift-and-add)——所以"两个变量乘法无法编译为移位加法"是错的。
十一、真题手算(五):运算电路
【408 真题 2024(15)】 关于整数乘法,错误的是?
-
A 阵列乘法器可一周期完成 ✓;B ALU+移位器实现需多周期 ✓;C x*10 可编译为 (x<<3)+(x<<1) ✓;D "两个变量乘无法编译为移位加法" 错。答案:D。
十二、类型转换(int / float / double)
-
int → float:可能丢精度(float 仅 24 位有效位,超则舍入,值可能变)。
-
float → int:截断小数。
-
float → double → float:精度无损,值不变。
【408 真题 2010(14)】 下列关系表达式"真"的是?
-
I i==(int)(float)i:785 往返不变 ✓;II f==(float)(int)f:1567.8 截断为 1567 再转 float ≠ 原值 ✗;III f==(float)(double)f:无损 ✓;IV (d+f)−d==f:d 极大,+f 被舍入,结果≈0≠f ✗。答案:B(仅 I 和 III)。
十三、易错点红黑榜
| 隐含位 1 | 尾数存储 | 规格化尾数整数位 1 不存,算完要还原 |
| 非规格化数 | 规格化数 | 阶码全 0、无隐含 1、阶取 −126 |
| 浮点溢出 | 尾数溢出 | 浮点溢出看阶码;尾数溢出仅误差 |
| 右规/舍入 | 上溢 | 右规和舍入都可能推高阶码到上溢 |
| 阵列乘法器 | 串行乘法器 | 阵列一周期完成;串行多周期 |
| int→float→int | 值不变 | float 有效位 24,超限丢精度 |
十四、速查表(文末收藏版)
| 单精度位域 | S(1) + E(8) + M(23),偏置 127 |
| 双精度位域 | S(1) + E(11) + M(52),偏置 1023 |
| 规格化真值 | (−1)ˢ × (1+M) × 2ᴱ⁻偏置 |
| 单精度最大正数 | 2¹²⁸ − 2¹⁰⁴ |
| 单精度最小规格化正数 | 1.0 × 2⁻¹²⁶ |
| 非规格化数 | 阶码 0、M≠0,阶取 −126、无隐含 1 |
| 浮点加减 | 对阶→尾数加减→规格化→舍入→判溢出 |
| 溢出判据 | 看阶码是否超范围(尾数溢出≠结果溢出) |
| 超前进位加法器 | 并行生进位,快于串行进位 |
| 阵列乘法器 | 一周期完成乘法,面积大 |
| int→float | 可能丢精度;float→double→float 无损 |
下一篇 组成原理 04|主存与 Cache 转战存储器——这是组成原理分值最高、综合题最频繁的一章,Cache 映射和平均访问时间是必拿分。




