进位计数制及其相互转换

这一节看上去只是小学算术的复习,但它在整门课里的地位并不低:后面每一次”算容量、算位数、算地址范围”,用的都是这里的两个结论——位权展开,以及 位能编码 个状态。

更重要的是,这一节埋着一个后面才会爆发的事实:十进制里写得出来的小数,二进制里往往写不出来。 这不是精度不够,而是根本无法有限表示。2.3.3 里 0.1 + 0.2 != 0.3 的全部原因,就在这一节。

机制

位权展开:一切转换的唯一原理

一个 进制数,基数是 (可用的数码有 个:),位权是 , 是该位相对小数点的位置(小数点左边第一位为 ,向左递增,向右递负)。所有进制转换题都只是这一个式子的两种用法:

  • 往十进制转:直接代入求和。
  • 从十进制转:反解各个 ,整数部分靠除法取余、小数部分靠乘法取整。

把这一点想明白,就不必分别记四五条规则。

进制 → 十进制:按权展开

逐位乘以位权再相加即可。

十进制 → 进制:整数除基取余,小数乘基取整

整数部分和小数部分必须分开做,规则还恰好相反,这是最容易记混的地方。原理都在位权展开式里:

整数部分,设 。整体除以 ,余数恰好就是 ,商则是去掉 后剩下的部分。反复做下去,先得到的余数是最低位,所以要逆序读出。

小数部分,设 。整体乘以 ,整数部分恰好就是 。反复做下去,先得到的整数是最高位,所以要顺序读出。

操作取什么读的方向何时停
整数部分除以基取余数逆序(从下往上)商为 0
小数部分乘以基取整数顺序(从上往下)小数部分为 0,或已达要求位数

“或已达要求位数”这半句是本节的重点,下面单独讲。

为什么十进制小数常常转不完

整数部分的转换一定会终止(商单调减小,必然到 0)。小数部分的转换则不保证终止。

以 转二进制为例:

小数部分回到了 ,于是 0011 无限循环:。

判据很干净:一个十进制小数能被二进制有限位精确表示,当且仅当它可以写成 ,即分母只含质因子 2。 可以; 都不行。

这条判据的一般形式: 进制下小数 有限,当且仅当 的最简分母的质因子全是 的质因子。十进制的基数 比二进制多了一个质因子 5,所以十进制能有限表示的小数,二进制未必能;反过来一定可以——任何有限位二进制小数,转成十进制一定也是有限的。

关联对照:本节是浮点误差的源头

0.1 + 0.2 != 0.3 与浮点数的位数无关,换成 128 位浮点同样不成立。原因不在 IEEE 754 的尾数长度,而在这里: 在二进制下根本没有有限表示,存进机器的那一刻已经不是 。详见 2.3.3。

二、八、十六进制之间:以小数点为中心分组

,,所以八进制一位对应二进制三位,十六进制一位对应二进制四位,转换是纯粹的分组与拆组,不需要做任何算术。

关键是分组的起点:必须以小数点为中心向两侧分,整数部分向左、小数部分向右,不足的一侧补 0。

八进制与十六进制之间没有直接的分组关系( 不是 的幂),必须先转成二进制再重新分组:

flowchart LR
    D["十进制"]:::dec
    B["二进制"]:::bin
    O["八进制"]:::hex
    H["十六进制"]:::hex

    D <-->|"除基取余 / 按权展开<br/><b>要做算术</b>"| B
    B <-->|"<b>3 位一组</b><br/>纯分组"| O
    B <-->|"<b>4 位一组</b><br/>纯分组"| H
    O -.->|"<b>无直接规则</b><br/>必须过二进制"| H

    classDef dec fill:#fef3c7,stroke:#d97706,color:#78350f
    classDef bin fill:#dbeafe,stroke:#2563eb,color:#1e3a5f
    classDef hex fill:#dcfce7,stroke:#16a34a,color:#14532d
    linkStyle 3 stroke:#dc2626,stroke-dasharray:5 5

十六进制在计组里之所以无处不在,正是因为它和二进制之间的转换零成本:0xFF 一眼就是 8 个 1,0x8000_0000 一眼就是”最高位 1、其余全 0”。做机器数题时先把数写成十六进制,几乎总能省事。

位数与状态数

位二进制可以区分 个不同状态;反过来,要区分 个状态至少需要 位。

这个式子在后面被反复使用:

用处形式出现在
存储单元数 → 地址线条数单元数2.1.3、第 3 章存储器
主存块数 → 主存块号位数同上第 3 章 Cache 映射
指令条数 → 操作码位数同上第 4 章指令格式
微命令数 → 微指令字段位数同上第 5 章微程序控制器

必须背下来的一组值:、、、。凡是看到 ,立刻读成 ,比算成 4194304 有用得多。

边界

容量的 K/M/G 与速率的 K/M/G 不是一回事

同一个”M”,在两种语境下差着 4.9%:

语境进制例
容量(存储器、Cache、地址空间)1MB B B
速率 / 频率 / 带宽1MHz Hz;100Mb/s b/s

判据是”这个量是不是由地址位数决定的”:由二进制位数决定的量(容量、块数、页数)按 ;由时间决定的量(频率、带宽、传输率)按 。

这条区别在第 3 章算存储器带宽和第 6 章算总线数据传输率时会直接影响答案。磁盘厂商标称的”1TB”用的是 ,操作系统显示的是 ,这就是买来的盘”少了”的原因。

进制 ≠ 编码

“用几进制书写”和”用什么规则解释这串位”是两个正交的问题。

这串位,作为无符号数是 129,作为补码是 ,作为原码是 ,作为 ASCII 是一个控制符。进制转换只回答”这串数码写成十进制是多少”,它不知道也不关心符号位。

所以做题时的第一动作永远是先确认编码规则,再谈数值。这一点在 2.1.2 展开。

BCD 码与校验码不在 2026 教材的三级节里

王道 2026 版第 2 章目录只有 三个二级节、12 个三级节(见 权威目录),其中既没有 BCD 码,也没有奇偶校验 / 海明码 / CRC。

旧版笔记里把 BCD 写成”2.1.2”是按旧目录推测的,节号错误,已归档。若在旧题里遇到 8421 码,只需记住它是**“每个十进制位单独用 4 位二进制编码”**,与整体转成二进制完全不同: 的 BCD 是 0001 0101,二进制是 1111。

对照速查

方向做法
按权展开求和
(整数)除基取余,逆序
(小数)乘基取整,顺序
3 位一组,以小数点为中心
4 位一组,以小数点为中心
必须过二进制
常用值

考点

  • 小数部分转换用”乘基取整、顺序读”,与整数部分的”除基取余、逆序读”方向相反
  • 小数转换可能不终止;判据是该小数能否写成
  • 分组必须以小数点为中心,两侧分别补 0
  • 八进制与十六进制之间没有直接分组规则
  • 位区分 个状态;求位数用
  • 容量的 K/M/G 是 ,速率的是
  • 进制与编码正交:同一位串在不同编码下是不同的数

链接