进制与进制转换
熟练进行二/八/十/十六进制互转,理解 8421 速算法与位权,为补码与位运算打基础
- 来源
- 补充
标记说明:【来源】来自上传资料 · 【补充】课程新编 · 【纠错】按勘误表修正 · 【更新】过时内容已现代化 · 【待确认】无法可靠还原
完成标准(本章)
- 📖 已阅读:滚动 ≥ 80% 且有效阅读 ≥ 120 秒
- ✏️ 已练习:小练习正确率 ≥ 60%
- 📝 已通过测验:分数 ≥ 60 分
- 🛠️ 已掌握还需完成实践任务
0.1.2 进制与进制转换
本章来源:换算方法来自《第一阶段讲义》11.1/11.2 节【来源】,重新组织表述;printf 演示代码、通俗解释与练习为课程新写【补充】。本章含 1 个可编译 C 演示(需完成 0.2 环境后回看运行)。平台适用性 universal。
① 学习目标
- 说出二/八/十/十六进制的位权展开方法;
- 用 8421 法在 15 秒内完成"二进制↔十六进制"互转;
- 手算验证 2026 的二进制与十六进制表示;
- 知道
0x前缀、%x/%X/%o格式与"0 开头是八进制"的 C 语言写法; - 完成 20 道换算题并建立 0-15 速查表(实践任务)。
② 前置知识
- 建议:0.1.1 计算机系统层次(理解为什么机器用二进制)。
③ 核心概念【来源】
| 概念 | 说明 |
|---|---|
| 位权展开 | 每位数字 × 其位权(2^n、16^n)再求和,即得到十进制值 |
| 二进制 | 基数为 2;每一位 0/1;每 4 位对应一个十六进制位 |
| 十六进制 | 基数为 16;数字 0-9 与字母 A-F(A=10…F=15);前缀 0x |
| 八进制 | 基数为 8;C 语言中以 0 开头(0755);printf 用 %o |
| 8421 法 | 二进制四位一组,按 8/4/2/1 位权求和得到 0-15,再映射为十六进制位 |
| 常见"满位"值 | 0xFF=255、0xFFFF=65535、0x7F=127、0x80=128(嵌入式高频) |
④ 通俗解释【补充】
把每一位想成一盏灯:亮=1、灭=0。
- 一盏灯只能表示 2 种状态,两盏 4 种,三盏 8 种……n 盏就是 2^n 种——这就是二进制位权(1、2、4、8…)的来历;
- 二进制写起来太长(2026 要写 11 位:11111101010),于是把每 4 盏灯分成一组,每组恰好是 0-15 共 16 种状态——给这 16 种状态各起一个名字(0-9、A-F),就是十六进制;
- 所以"十六进制是二进制的缩写":一个十六进制位 = 4 个二进制位 = 4 盏灯。寄存器地址、内存数据、调试器内容之所以都用十六进制,就是因为人眼读 0x7EA 比读 11111101010 快得多。
⑤ 示例代码【补充,代码新写并实测】
代码示例与验证记录
- examples/ex1-printf-bases.cprintf 输出四种进制(验证手工换算)✓ 已实测(gcc 15.2.0 / MinGW-w64 x86_64, 2026-08-15)编译:
gcc ex1-printf-bases.c -o ex1 -std=c11 -Wall -Wextra -Wpedantic适用环境:LinuxWindows(MinGW)展开预期输出(实测)
十进制: 2026 八进制: 3752 十六进制(小写): 7ea 十六进制(大写): 7EA 带前缀: 0x7ea 验证: 2026 & 0xFF = 234 (0xEA)
差异说明:需先完成 0.2 环境搭建后回看运行;本输出为 gcc 15.2.0 实测
完整源码见 /code 代码示例页
⑥ 编译与运行方法
示例 ex1 的编译命令与实测输出见上方示例卡。注意顺序:本章学习时开发环境(0.2)可能尚未安装,请先手算完成练习与测验,待 0.2 完成后回看运行 ex1,用它核对 2026 的换算结果。
⑦ 常见错误
| 症状 | 原因 | 解决 |
|---|---|---|
| 把 0x10 当成 10 | 前缀 0x 表示十六进制 | 0x10 = 16;十进制 10 写作 10 |
| 把 C 的 010 当成 10 | 0 开头是八进制字面量 | 010 = 8(十进制);避免给十进制数加前导 0 |
| 二进制转十六进制分组方向错 | 未从右往左分组 | 从最低位起每 4 位一组,最高组不足补 0 |
| 0xF 算成 16 | F=15,满 16 进位 | 0x10 才是 16 |
| 以为十六进制能表示负数 | 进制是表示方式,符号由解释方式决定 | 负数用补码(下一章)表示后再写成十六进制 |
⑧ 小练习
小练习
学习自测:提交后才显示答案与解析(前端判分,不作为正式考试)ex-0-1-2-1.二进制数 1011 对应的十进制是?(单选)
◌ 未作答ex-0-1-2-2.填空:十六进制数 0x3F 对应的十进制是 ______。(填空)
◌ 未作答ex-0-1-2-3.十进制 255 用十六进制表示是?(单选)
◌ 未作答
⑨ 章节测验
章节测验
⑩ 实战任务
实践任务
完成 20 道进制换算并自建速查表
通过 20 道手工换算题达到"15 秒一题"的熟练度,并制作一张 0-15 的"十进制/二进制/十六进制" 对照速查表,作为后续所有课程(位运算/内存地址/寄存器)的案头工具。
输入与输出
无程序输入输出。交付物:①20 道换算题(自拟或按题目池)全部正确;②一张 0-15 对照表; ③(完成 0.2 环境后)运行 ex1 验证 2026 的四种进制输出与自己手算一致。
功能要求
- 20 道题覆盖:十进制↔二进制(8 题)、十进制↔十六进制(6 题)、二进制↔十六进制(6 题)
- 对照表包含 0-15 的二进制(4 位)与十六进制
- 记录每题耗时,目标平均 ≤15 秒
限制条件
- 手算为主,禁止使用计算器进制功能
- ex1 验证步骤需在完成 0.2 环境后回看执行(本章学习时环境可能未安装)
验收步骤(自检清单 0/4)
验收标准
- 20 题全部正确且平均耗时 ≤15 秒(验收步骤 1)
- 速查表无错(验收步骤 2)
- ex1 输出与手算一致(验收步骤 3,环境未装时标记待回看)
- 能解释 16=2^4 的对应关系(验收步骤 4)
常见失败原因
- 二进制位权从 1 开始按 1,2,4,8 递增,算反方向
- 0xF 误算成 16(F=15,0x10 才是 16)
- 十六进制转二进制时每 4 位一组,组内位数不足时忘补零
可选扩展
- 把对照表扩展到 0-255 的十六进制
- 预习 0.1.3:写出 -1 的 8 位补码(答案留到下一章核对)
完成必要清单后才能计入"已完成实践"(学习状态自动推导,不提供一键完成)
⑪ 面试问题
面试问题
为什么计算机使用二进制?嵌入式 · easy
要点:物理实现简单可靠:高低电平天然对应 0/1,抗干扰强、电路易于实现与校验。
二进制只有两个状态,用高低电平(开/关、导通/截止)即可表示,元件容差大、抗噪声能力强; 逻辑运算(与或非)与二进制天然对应;多值逻辑(如三进制)在物理实现与可靠性上成本高得多。 补充:十六进制是二进制的"速记法",4 个二进制位正好一个十六进制位,便于人阅读与书写。
追问:- 追问:为什么用十六进制而不是十进制做速记?
评分要点:- 物理可靠性
- 与逻辑运算的对应
- 提及十六进制是二进制的缩写加分
0xFF 等于多少?这类值在嵌入式里有什么用?高频嵌入式 · easy
要点:255。常用于位掩码(取低 8 位)、寄存器配置、GPIO 端口全置位等。
0xFF = 1111 1111 = 255。嵌入式里常作位掩码:value & 0xFF 取低 8 位;GPIO 端口写 0xFF 表示 8 个引脚全部置高;UART 帧等协议里 0xFF 常作填充/帧头。记住 0x0F/0xF0/0xFF/0xFFFF 这类"满位"值与 0x80/0x8000 这类"最高位"值是面试与工程的日常。
追问:- 追问:value & 0xFF 与 value % 256 等价吗?(对非负 value 等价)
评分要点:- 算出 255
- 举出掩码/寄存器用法
八进制在哪些场景还会遇到?嵌入式 · easy
要点:文件权限(如 chmod 755)、printf 的 %o 输出、少数老协议;主流场景已被十六进制取代。
Linux 文件权限 rwx 三组恰好三位二进制对应一个八进制位(755 = 111 101 101),是八进制最 常见的现代应用;C 语言中 0 开头的字面量是八进制(如 0755),书写时要小心:010 ≠ 10。 其余场景(地址、寄存器、调试器)基本都用十六进制。
追问:- 追问:C 语言里 010 等于十进制多少?(8)
评分要点:- 文件权限场景
- 指出 0 前缀字面量陷阱
⑫ 延伸阅读
- 《计算机组成与设计》第 2 章:数制与运算(英文原版 Number Systems 一节);
- C 标准库文档:printf 格式说明(%d/%x/%X/%o);
- 维基百科词条:Hexadecimal / Binary number(查阅入口,不复制内容);
- 下一章预告:0.1.3 原码/反码/补码与溢出——负数在计算机里到底怎么存。
内容来源映射
| 内容部分 | 资料 | 位置 | 标记 | 说明 |
|---|---|---|---|---|
| 四种进制、进制转换方法、8421 速算法 | 第一阶段讲义 | 11.1/11.2 节(PAGE 177-178) | 【来源】 | 正文重新组织表述;示例代码为课程新写 |
| printf 进制输出演示(ex1) | 无 | 【补充】 | 原资料无本代码,重新编写并实测;需先完成 0.2 环境搭建后回看运行 | |
| 通俗解释(灯开关类比)、练习/测验/任务 | 无 | 【补充】 | 全部新编 |