Skip to content

进位计数制与转换

2026 大纲 二(一)1 进位计数制及其数据之间的相互转换

四种进制其实只有一个式子

二进制、八进制、十进制、十六进制看起来是四套东西,其实共用同一个定义:

V=i=mnki×Ri,ki{0, 1, , R1}

区别只在基数 R,以及由它决定的位权 Ri。所以"学会四种进制"这件事根本不存在——学会的是一个式子,把 R 代四次而已。

顺着这个式子,两个方向的转换也就定了:R 进制转十进制就是按权展开,它本身就是定义,没有任何技巧;反过来十进制转 R 进制要分整数和小数两段,而这两段的规则方向正好相反

🔴 整数除基取余,先出来的是最低位,写答案要逆序;小数乘基取整,先出来的是最高位,写答案是顺序。 一句话记:除法把低位挤出来,乘法把高位顶上去。

⚠️ 还有一条最基础的前提:同一串数码在不同进制下是不同的值——(11)2=3(11)8=9(11)16=17。脱离进制标注谈"这个数是多少"没有意义,所以机器数书写必须带 H / B 后缀。

一、位置计数法与数码

一个进制由两件事定义:基数 R(每一位可用的数码个数)和位权 Ri(第 i 位上的 1 代表多大)。十进制的 2585.62 之所以是 2×103+5×102+8×101+5×100+6×101+2×102,唯一的原因就是 R=10;把 R 换成 2、8、16,式子的形状一个字都不用改。

十进制二进制八进制十六进制
0~70000~01110~70~7
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F

十六进制超过 9 的六个数码借用字母 A~F 代表 10~15。书写时用后缀字母标明进制:B 二进制、O 八进制、D 十进制(可省)、H 十六进制,例如 10011B308FH

按权展开就是上面那个式子本身:

(1101.01)2=1×23+1×22+0×21+1×20+0×21+1×22=13.25(2AF)16=2×162+10×161+15×160=512+160+15=687

计算机内部只有二进制,为什么人还要学十六进制

二进制位串太长,1110 0000 0000 0010 这样的东西人读一遍就会出错。十六进制的一位恰好对应二进制的四位,长度压到 1/4不损失任何位信息,所以它只是二进制的一种书写简写,不是另一套编码。

八进制同理,一位对应三位二进制。之所以现在十六进制更常用,是因为主流字长(8/16/32/64 位)都是 4 的倍数,用四位一组正好分尽,用三位一组则会在最高位剩零头。

二、十进制 → R 进制:两条规则的方向是推出来的

整数部分除基取余、小数部分乘基取整,两条规则方向相反,这不是约定而是从展开式里推出来的(结论见速查)。

两条规则各自的代数推导,以及 43 与 0.625 的完整竖式(想弄清"为什么整数逆序、小数顺序"而不是死记时展开)

整数部分:除基取余,先得到的是低位。 设整数 N=knRn++k1R1+k0,用 R 去除它:

NR=knRn1++k1+k0R

除了 k0 之外,每一项都含至少一个 R 因子,整除后进入商;只有 k0 除不尽,落进余数。所以第一次除法的余数必然是最低位数码。 拿商继续除,第二次余数就是次低位,直到商为 0。因为余数是从低位往高位依次冒出来的,写答案时必须逆序

(43)10 二进制:

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

逆着读:(101011)2

小数部分:乘基取整,先得到的是高位。 设纯小数 F=k1R1+k2R2+,用 R 去乘它:

F×R=k1整数部分+k2R1+k3R2+仍是纯小数

R 使所有权上升一级,原来权为 R1 的那一位刚好升到 R0溢出成整数部分。所以第一次乘法得到的整数是最高位小数位;整数位从高位往低位依次冒出来,写答案时顺序排列。

(0.625)10 二进制:

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.101)2

三、二进制 ↔ 八/十六进制:分组为什么是机械的

以八进制为例,把二进制展开式每三项括在一起:

+(b522+b421+b3)值域 07×23+(b222+b121+b0)值域 07×20

括号里的值恰好落在 07,正是一个八进制数码;括号外的公因子 23=8120=80,正是八进制的位权。所以三位二进制原封不动就是一位八进制,没有任何计算发生。十六进制同理,每四位对应 015,公因子是 24=161

(011010101.1101)2:0113 0102 1015 . 1106 1004=(325.64)8(10101111.01)2:1010A 1111F . 01004=(AF.4)16

分组必须从小数点向两侧展开,因为公因子的指数是以小数点为原点数出来的。

🔴 补 0 要补在权更极端的那一端:整数端在左端(高位)补,小数端在右端(低位)补,补的都是空位、不改变数值。往错的一端补——比如把 .01 补成 .001——数值直接被除以 2。这是分组转换里唯一会算错数值的地方。

🔴 二 ↔ 十没有分组捷径,因为 10 不是 2 的幂,两边的权对不齐,任何一位十进制数码都无法只由固定几位二进制拼出来。所以十六 ↔ 二永远走分组、不经十进制中转——中转一次就多一次算错的机会,遇到写不完的小数还会引入截断。

顺带记一条位数关系:n 位二进制(n 为 4 的倍数)严格对应 n/4 位十六进制,8 位写 2 个、16 位写 4 个、32 位写 8 个。这是严格的 1/4 不是近似;n 不是 4 的倍数时高位补 0 凑齐,位数变多、值没变。

另有一条手算捷径:二进制的权是 1,2,4,8,,1024,,把十进制整数拆成若干权之和比反复做除法快——8261=213+26+22+20,于是第 13、6、2、0 位置 1。

同一个十六进制数走两条路:经十进制中转与直接分组,结果对得上(想验证「十六 ↔ 二不必经十进制中转」这条结论时展开)

(C5.A)16 转成二进制。第一条路,经十进制中转——先按权展开:

12×161+5×160+10×161=192+5+0.625=197.625

再把 197 除基取余、0.625 乘基取整,才得到二进制。第二条路,直接分组——十六进制一位直接摊成四位,不做任何计算:

C1100,50101,A1010(C5.A)16=(11000101.1010)2=(11000101.101)2

小数末尾的 0 可省。验算:0.1012=0.5+0.125=0.625 ✓,与第一条路算出的小数部分一致。

两条路结果相同,但第一条路做了两次进制运算、第二条路一次都没做。中转一次就多一次算错的机会,遇到写不完的小数还会引入截断——这就是那条结论的全部依据。

四、哪些十进制小数写得完

有限位二进制小数的值形如 2k——分母只能是 2 的幂。所以判据是:一个十进制小数能用有限位二进制精确表示,当且仅当它化成最简分数后分母是 2 的幂。

十进制小数最简分数分母有限位二进制
0.51/2210.1
0.251/4220.01
0.6255/8230.101
0.812513/16240.1101
0.11/1025写不完
0.33/1025写不完

分母里只要含 2 以外的质因子,乘 2 取整就永远归不了零,转换过程进入循环,只能截断。这是浮点数精度误差的根源,也是 0.1 + 0.2 != 0.3 的来历——具体后果见 浮点数表示(IEEE 754)

考点速记

  1. 所有进制共用 V=kiRi 一个式子,区别只在基数与位权;R 进制转十进制就是按权展开,即定义本身。
  2. 十进制转 R 进制的两条规则方向相反且都可推出:除法把低位挤出来(整数除基取余、逆序),乘法把高位顶上去(小数乘基取整、顺序)。
  3. 二 ↔ 八/十六能机械分组是因为 8=2316=24分组以小数点为原点向两侧补 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)

真题练习