跳到主要内容
🔍
0.1.2已发布beginner · 约 1.5 课时 · P0

进制与进制转换

熟练进行二/八/十/十六进制互转,理解 8421 速算法与位权,为补码与位运算打基础

  • 来源
  • 补充

标记说明:【来源】来自上传资料 · 【补充】课程新编 · 【纠错】按勘误表修正 · 【更新】过时内容已现代化 · 【待确认】无法可靠还原

完成标准(本章)

  • 📖 已阅读:滚动 ≥ 80% 且有效阅读 ≥ 120
  • ✏️ 已练习:小练习正确率 ≥ 60%
  • 📝 已通过测验:分数 ≥ 60
  • 🛠️ 已掌握还需完成实践任务
学习状态:未开始

0.1.2 进制与进制转换

本章来源:换算方法来自《第一阶段讲义》11.1/11.2 节【来源】,重新组织表述;printf 演示代码、通俗解释与练习为课程新写【补充】。本章含 1 个可编译 C 演示(需完成 0.2 环境后回看运行)。平台适用性 universal。

① 学习目标

  1. 说出二/八/十/十六进制的位权展开方法;
  2. 用 8421 法在 15 秒内完成"二进制↔十六进制"互转;
  3. 手算验证 2026 的二进制与十六进制表示;
  4. 知道 0x 前缀、%x/%X/%o 格式与"0 开头是八进制"的 C 语言写法;
  5. 完成 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 当成 100 开头是八进制字面量010 = 8(十进制);避免给十进制数加前导 0
二进制转十六进制分组方向错未从右往左分组从最低位起每 4 位一组,最高组不足补 0
0xF 算成 16F=15,满 16 进位0x10 才是 16
以为十六进制能表示负数进制是表示方式,符号由解释方式决定负数用补码(下一章)表示后再写成十六进制

⑧ 小练习

小练习

学习自测:提交后才显示答案与解析(前端判分,不作为正式考试)
  • ex-0-1-2-1.二进制数 1011 对应的十进制是?(单选)

    ◌ 未作答
  • ex-0-1-2-2.填空:十六进制数 0x3F 对应的十进制是 ______。(填空)

    ◌ 未作答
  • ex-0-1-2-3.十进制 255 用十六进制表示是?(单选)

    ◌ 未作答

⑨ 章节测验

章节测验

5 题题库 · 随机抽 5 题 · 及格线 60 分 · 前端判分(学习自测)
开始测验 →

⑩ 实战任务

实践任务

完成 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 环境搭建后回看运行
通俗解释(灯开关类比)、练习/测验/任务补充全部新编