Appearance
进位计数制与转换
2026 大纲 二(一)1 进位计数制及其数据之间的相互转换。
四种进制其实只有一个式子
二进制、八进制、十进制、十六进制看起来是四套东西,其实共用同一个定义:
区别只在基数
顺着这个式子,两个方向的转换也就定了:
🔴 整数除基取余,先出来的是最低位,写答案要逆序;小数乘基取整,先出来的是最高位,写答案是顺序。 一句话记:除法把低位挤出来,乘法把高位顶上去。
⚠️ 还有一条最基础的前提:同一串数码在不同进制下是不同的值——H / B 后缀。
一、位置计数法与数码
一个进制由两件事定义:基数
| 十进制 | 二进制 | 八进制 | 十六进制 |
|---|---|---|---|
| 0~7 | 0000~0111 | 0~7 | 0~7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
十六进制超过 9 的六个数码借用字母 A~F 代表 10~15。书写时用后缀字母标明进制:B 二进制、O 八进制、D 十进制(可省)、H 十六进制,例如 10011B、308FH。
按权展开就是上面那个式子本身:
计算机内部只有二进制,为什么人还要学十六进制
二进制位串太长,1110 0000 0000 0010 这样的东西人读一遍就会出错。十六进制的一位恰好对应二进制的四位,长度压到
八进制同理,一位对应三位二进制。之所以现在十六进制更常用,是因为主流字长(8/16/32/64 位)都是 4 的倍数,用四位一组正好分尽,用三位一组则会在最高位剩零头。
二、十进制 → R 进制:两条规则的方向是推出来的
整数部分除基取余、小数部分乘基取整,两条规则方向相反,这不是约定而是从展开式里推出来的(结论见速查)。
两条规则各自的代数推导,以及 43 与 0.625 的完整竖式(想弄清"为什么整数逆序、小数顺序"而不是死记时展开)
整数部分:除基取余,先得到的是低位。 设整数
除了
43 ÷ 2 = 21 ... 余 1 ← 最低位 b0
21 ÷ 2 = 10 ... 余 1 b1
10 ÷ 2 = 5 ... 余 0 b2
5 ÷ 2 = 2 ... 余 1 b3
2 ÷ 2 = 1 ... 余 0 b4
1 ÷ 2 = 0 ... 余 1 ← 最高位 b5逆着读:
小数部分:乘基取整,先得到的是高位。 设纯小数
乘
0.625 × 2 = 1.25 → 取整 1 ← 最高位 b-1
0.25 × 2 = 0.5 → 取整 0 b-2
0.5 × 2 = 1.0 → 取整 1 b-3,小数部分归零,结束顺着读:
三、二进制 ↔ 八/十六进制:分组为什么是机械的
以八进制为例,把二进制展开式每三项括在一起:
括号里的值恰好落在
分组必须从小数点向两侧展开,因为公因子的指数是以小数点为原点数出来的。
🔴 补 0 要补在权更极端的那一端:整数端在左端(高位)补,小数端在右端(低位)补,补的都是空位、不改变数值。往错的一端补——比如把
.01补成.001——数值直接被除以 2。这是分组转换里唯一会算错数值的地方。
🔴 二 ↔ 十没有分组捷径,因为 10 不是 2 的幂,两边的权对不齐,任何一位十进制数码都无法只由固定几位二进制拼出来。所以十六 ↔ 二永远走分组、不经十进制中转——中转一次就多一次算错的机会,遇到写不完的小数还会引入截断。
顺带记一条位数关系:
另有一条手算捷径:二进制的权是
同一个十六进制数走两条路:经十进制中转与直接分组,结果对得上(想验证「十六 ↔ 二不必经十进制中转」这条结论时展开)
把
再把
小数末尾的 0 可省。验算:
两条路结果相同,但第一条路做了两次进制运算、第二条路一次都没做。中转一次就多一次算错的机会,遇到写不完的小数还会引入截断——这就是那条结论的全部依据。
四、哪些十进制小数写得完
有限位二进制小数的值形如
| 十进制小数 | 最简分数 | 分母 | 有限位二进制 |
|---|---|---|---|
| 0.5 | |||
| 0.25 | |||
| 0.625 | |||
| 0.8125 | |||
| 0.1 | 写不完 | ||
| 0.3 | 写不完 |
分母里只要含 2 以外的质因子,乘 2 取整就永远归不了零,转换过程进入循环,只能截断。这是浮点数精度误差的根源,也是 0.1 + 0.2 != 0.3 的来历——具体后果见 浮点数表示(IEEE 754)。
考点速记
- 所有进制共用
一个式子,区别只在基数与位权; 进制转十进制就是按权展开,即定义本身。 - 十进制转
进制的两条规则方向相反且都可推出:除法把低位挤出来(整数除基取余、逆序),乘法把高位顶上去(小数乘基取整、顺序)。 - 二 ↔ 八/十六能机械分组是因为
、 ,分组以小数点为原点向两侧补 0;二 ↔ 十没有这个待遇。有限位二进制能表示的十进制小数,当且仅当最简分数的分母是 2 的幂。
这一节在真题里的位置:
进制转换在 408 真题里不单独成题。下方「真题练习」挂的是 fixed-point-encoding 这个 topic, 它汇集了整个定点数编码部分的题——其中没有一道是只考进制转换的,它们分别属于 机器数与真值、编码与转换、 移位运算 与 C 语言类型转换。
进制转换真正出现的方式是作为别的题的某一步:机器数用十六进制给出时要摊成二进制才能切字段(Cache 地址划分、指令格式),算出来的位串又要转回十六进制填答案(求机器数、算物理地址)。
所以本篇的复习优先级是:手上要快,不必单独刷题。真正值得练到不假思索的是三件事——十六进制与二进制的四位一组互转、按权展开求值、以及小数部分乘基取整的方向。剩下的(八进制、十进制转二进制的除基取余)在 408 里出现频次很低,会做即可。
易错:分组补 0 补错了一端。整数补高位、小数补低位,补的必须是权更极端的空位。
易错:小数乘基取整之后把顺序写反。整数部分才要逆序,小数部分是顺序。
易错:十六进制转二进制时绕道十进制。直接分组,一次计算都不用做。
教材出处
- 位置计数法的一般式、按权展开、"除基取余/乘基取整"及其例题:袁春风《计算机组成与系统结构》第 3 版 §2.1.2 进位记数制,印刷页 p24–p26
- 利用二进制权凑数的快速转换法(例 2.8):同书 §2.1.2,印刷页 p27
相关知识
真值与机器数:四种编码的定义|定点数编码的转换与书写|浮点数表示(IEEE 754)