
简介这份PPT面向计算机零基础学习者与入门教学场景系统梳理计算机科学与技术的基础概念帮助读者建立完整的知识框架。内容从计算机发展简史切入涵盖电子管到超大规模集成电路四个阶段并延伸至计算机特点、应用领域与分类方式同时讲解二进制、十进制、十六进制等数制及其相互转换ASCII与Unicode字符编码指令与程序设计语言以及硬件系统与软件系统的组成结构。资源还涉及多媒体技术简介与计算机病毒防治要点目录模块清晰便于按章节自学或课堂讲授。包内共1个PPT文件压缩包约186KB体积轻便适合快速查阅与课件复用。目前已有58人学习适合备考计算机一级、准备课堂展示或希望补齐基础短板的读者作为入门参考。1. 从一份“计算机基础知识--普及.ppt”说起数制、指令与系统到底怎么串起来很多人第一次接触计算机基础是从一份叫“计算机基础知识--普及.ppt”的课件开始的。它通常出现在大一第一堂课、软考备考的第一章或者转行自学时的入门资料里。但真正让从业者卡住的往往不是“计算机由运算器、控制器、存储器组成”这种背了忘、忘了背的结论而是几个更具体的问题数制与编码为什么非要讲二进制和补码指令到底长什么样、CPU 怎么读懂它程序设计语言和机器指令之间隔着几层计算机系统这几个字究竟指硬件、软件还是两者合起来的那套协作机制这份课件标题里的“普及”两个字容易让人误以为它只是科普。实际上它覆盖的正是计算机系统这条主线数据在机器里怎么表示数制与编码机器怎么被驱动指令人怎么指挥机器程序设计语言以及这些部分如何组成一个能跑起来的计算机系统。热搜里反复出现的“计算机系统”“软考计算机系统知识考点”“深入理解计算机系统”本质上都在追问同一件事——从比特到程序中间那条链路是怎么打通的。这篇笔记不打算复述课件里的定义而是把这份“普及.ppt”背后的知识骨架拆成能动手验证的路径先讲清数制与编码的落地算法再拆指令的格式与执行然后看程序设计语言如何翻译成指令最后落到计算机系统的分层与排查。适合刚入门想建立整体框架的人也适合备考软考、需要把零散考点串成体系的人。下面每一章都尽量给出可复现的代码或可对照的参数而不是停留在概念层。2. 数制与编码把十进制、二进制、补码用代码跑一遍数制与编码是计算机基础里最容易被“背过去”的一章但也是最该动手的一章。原因很简单补码、溢出、浮点精度这些坑光看文字永远记不牢写几行代码打印出来印象立刻不一样。这一章先把进制转换和补码的算法逻辑讲清楚再用 Python 把关键过程跑一遍最后说清参数边界在哪。2.1 进制转换的手算逻辑与代码验证进制转换的核心是“除基取余、逆序排列”。十进制转二进制就是不断除以 2把余数从下往上读。这个规则人人会背但真正写代码时边界条件才是重点0 怎么处理、负数怎么办、转换结果要不要补前导零。def dec_to_base(n, base): # n: 待转换的十进制整数base: 目标进制(2/8/16) if n 0: return 0 digits 0123456789ABCDEF negative n 0 n abs(n) result [] while n 0: result.append(digits[n % base]) # 取余数作为当前位 n // base # 整除进入下一轮 if negative: result.append(-) return .join(reversed(result)) # 逆序才是最终结果 print(dec_to_base(156, 2)) # 10011100 print(dec_to_base(156, 16)) # 9C print(dec_to_base(-156, 2)) # -10011100这段代码里base决定目标进制digits表把 10 到 15 映射成 A 到 Fnegative单独处理符号位。逻辑说明循环里每次取n % base得到最低位n // base把已处理的最低位丢掉最后reversed把低位到高位的顺序翻过来。参数说明base一般取 2、8、16取其他值也能跑但超过 16 就需要扩展digits表。失败时先看n是否为 0因为 0 不进循环必须单独返回。提示手算时容易把余数顺序写反代码里reversed就是专门治这个的。建议自己先用纸算一遍 156再和输出对照。2.2 补码、溢出与浮点误差三个必须亲手验证的坑补码是数制与编码里最关键的编码方式因为它把减法变成了加法。以 8 位为例-1 的补码是 11111111-128 是 10000000。规则是正数原样负数取反加一。但真正容易翻车的是溢出判断和浮点表示。def to_twos_complement(n, bits8): # n: 有符号整数bits: 位宽 if n 0: return format(n, f0{bits}b) return format((1 bits) n, f0{bits}b) # 负数用模运算得到补码 print(to_twos_complement(5)) # 00000101 print(to_twos_complement(-5)) # 11111011 print(to_twos_complement(-128)) # 10000000 # 浮点误差演示 print(0.1 0.2) # 0.30000000000000004 print(0.1 0.2 0.3) # False逻辑说明(1 bits) n等价于2^bits n对负数来说正好得到补码的整数形式再用format转成二进制字符串。参数说明bits决定位宽8 位范围是 -128 到 12716 位是 -32768 到 32767超出范围就会溢出。浮点部分0.1 和 0.2 在二进制里都是无限循环小数存储时被截断相加后自然不等于 0.3。这不是 bug是 IEEE 754 的固有特性。注意判断浮点相等不要用常见做法是判断差值绝对值小于一个极小值比如abs(a - b) 1e-9。这个习惯在后续做数值计算时能省掉很多排查时间。3. 指令从机器指令格式到一次完整的取指执行指令是计算机基础里承上启下的一环。往上它对应程序设计语言编译后的产物往下它对应 CPU 内部的电路动作。热搜里“isb指令”“ecall指令”“花指令”“cmd指令大全”虽然场景不同但都指向同一个问题指令到底是什么、怎么被识别和执行。这一章把指令格式、寻址方式和执行周期讲透再用一个模拟器把取指执行跑出来。3.1 指令格式与寻址方式操作码和地址码怎么分工一条机器指令通常由操作码和地址码组成。操作码告诉 CPU 做什么地址码告诉 CPU 对谁做。以常见的三地址指令为例格式可以写成OP A B C含义是A B OP C。寻址方式则决定地址码怎么解释立即寻址直接给数值直接寻址给内存地址间接寻址给“存放地址的地址”寄存器寻址直接指定寄存器。寻址方式地址码含义典型场景访存次数立即寻址操作数本身常量赋值0直接寻址操作数内存地址全局变量1间接寻址地址的地址指针操作2寄存器寻址寄存器编号循环变量0这张表是选型时的对照依据访存次数越多执行越慢。写汇编或看反汇编时先判断寻址方式就能大致估出这条指令的开销。常见做法是能放寄存器就不放内存能立即数就不多一次访存。3.2 用 Python 模拟一次取指-译码-执行周期理解指令最好的方式是自己模拟一遍。下面这段代码实现了一个极简的指令周期从内存取指令、译码、执行、更新程序计数器。memory [0x10, 0x05, 0x20, 0x03, 0x00, 0x00] # 模拟内存 registers {A: 0, B: 0} pc 0 # 程序计数器 def fetch(): global pc instr memory[pc] # 取指令 pc 1 return instr def decode_execute(instr): op instr 4 # 高4位是操作码 operand instr 0x0F # 低4位是操作数 if op 0x1: registers[A] operand # 加载立即数到A elif op 0x2: registers[B] registers[A] # A复制到B return op, operand while pc len(memory): instr fetch() if instr 0x00: break op, operand decode_execute(instr) print(fPC{pc-1} 指令0x{instr:02X} 操作码{op} 操作数{operand} A{registers[A]} B{registers[B]})逻辑说明fetch从memory[pc]取指令并让pc自增decode_execute用位运算拆出操作码和操作数再根据操作码执行。参数说明 4和 0x0F是固定的拆分方式换成 8 位操作码就改成 0和 0xFF。失败时先看pc是否越界再看操作码是否在已实现的分支里未实现的操作码会被静默跳过这是模拟器最常见的“黑匣子”行为。提示真实 CPU 的指令周期还包括中断检查、流水线冒险处理这里只保留最核心的四步。理解了这个骨架再看“isb指令”“ecall指令”这类具体指令就只是操作码和语义的差异。4. 程序设计语言高级语言到机器指令之间隔了什么程序设计语言这一环回答的是“人写的代码怎么变成机器能执行的指令”。热搜里“cmd指令大全”“linux指令”“git指令”是操作层面的命令而“程序设计语言”关注的是语言本身的翻译机制。两者容易混但层次不同前者是人机交互的命令后者是语言到机器的编译链路。这一章讲清编译、解释、汇编三种路径再用一个最小例子走完从源码到指令的过程。4.1 编译、解释与汇编三条落地路径的选型对比高级语言要变成机器指令常见有三条路。编译型语言先整体翻译成目标代码再执行运行快但编译慢解释型语言逐行翻译执行灵活但慢汇编语言则和机器指令几乎一一对应需要汇编器翻译。选型时看场景追求性能选编译追求跨平台和快速迭代选解释追求对硬件的精确控制选汇编。路径代表语言翻译时机执行效率可移植性编译C/C运行前整体翻译高低解释Python运行时逐行翻译低高汇编汇编语言运行前逐条翻译最高最低这张表不是绝对的很多语言是混合模式比如 Java 先编译成字节码再解释或即时编译。常见做法是先确定性能要求和部署环境再选路径而不是先选语言再迁就。4.2 从一行高级代码到指令序列的对照下面用一段简单代码对照它可能被翻译成的指令序列。这不是某个真实编译器的输出而是帮助建立直觉的示意。# 高级语言 a 3 b 4 c a b对应的指令序列示意LOAD R1, #3 ; 把立即数3加载到寄存器R1 LOAD R2, #4 ; 把立即数4加载到寄存器R2 ADD R3, R1, R2 ; R3 R1 R2 STORE c, R3 ; 把R3存回变量c逻辑说明高级语言里一行c a b在指令层被拆成加载、相加、存储三步。参数说明#3表示立即数R1到R3是寄存器编号c是内存地址。失败时先看寄存器是否够用寄存器不足会导致额外的访存指令性能下降。这也是为什么写高性能代码时要关注寄存器分配。注意不同架构的指令集差异很大x86 和 ARM 的指令格式、寄存器数量都不同。上面只是通用示意实际对照要看目标平台的指令集手册。5. 计算机系统分层结构、性能指标与常见排查思路计算机系统这个词在软考和入门课里出现频率极高但它不是一个零件而是硬件、软件、指令集、操作系统共同组成的分层体系。热搜里“计算机系统导论课后答案”“软考计算机系统知识考点”说明很多人需要把它当成一个可考的体系来掌握。这一章把分层结构讲清给出性能指标的计算方式再落到排查思路。5.1 计算机系统的五层结构与各层职责从下往上计算机系统通常分为微架构层、指令集层、操作系统层、汇编语言层、高级语言层。微架构层是电路和寄存器指令集层是机器指令的集合操作系统层负责资源管理汇编语言层是指令的符号化高级语言层面向开发者。每一层都向上层提供接口屏蔽下层细节。层次关注点典型产物向上提供微架构层电路、时序数据通路指令执行能力指令集层指令格式、寻址机器指令编程接口操作系统层进程、内存、文件系统调用资源抽象汇编语言层符号、伪指令汇编程序可读指令高级语言层语法、语义应用程序开发效率这张表的价值在于定位问题程序跑得慢可能在高层次是算法问题在低层次是指令或访存问题。排查时先确定问题落在哪一层再往下钻比盲目改代码有效。5.2 性能指标计算与一次自底向上的排查计算机系统常见的性能指标有 CPI、MIPS、主频、吞吐量。CPI 是每条指令的平均时钟周期数MIPS 是每秒百万条指令。公式是MIPS 主频 / (CPI × 10^6)。这些指标不是背的是算的。def mips(freq_hz, cpi): # freq_hz: 主频(Hz)cpi: 每条指令平均周期数 return freq_hz / (cpi * 1e6) print(mips(2e9, 1.5)) # 约1333 MIPS print(mips(2e9, 3.0)) # 约666 MIPS逻辑说明主频除以 CPI 得到每秒指令数再除以 10^6 换算成百万。参数说明freq_hz用赫兹2GHz 写成 2e9cpi是平均值不同指令混合比例会改变它。失败时先确认单位主频用 MHz 还是 Hz 会导致结果差 1000 倍这是最常见的翻车点。排查思路自底向上先看硬件资源是否打满再看指令层是否有低效指令再看操作系统层是否有调度或内存问题最后看应用层算法。这个顺序能避免一上来就改代码却找不到根因。6. 避坑与常见问题数制、指令、语言、系统四类翻车记录这一章集中记录四类高频踩坑每条按现象、原因、解决写。这些坑在课件里通常不会展开但实际动手时几乎都会遇到。坑一补码范围算错导致溢出。现象是 8 位下算 -128 的相反数得到 -128逻辑上说不通。原因是 8 位补码范围是 -128 到 127-128 没有对应的正数。解决是提前判断边界或者用更宽的位宽比如 16 位。坑二浮点相等判断用 。现象是0.1 0.2 0.3返回 False以为程序出错。原因是二进制无法精确表示这些小数。解决是改用差值判断abs(a - b) 1e-9或者用 decimal 模块做精确计算。坑三寻址方式判断错导致访存次数估错。现象是性能分析时算出的访存次数和实测对不上。原因是被间接寻址和寄存器间接寻址混淆。解决是看反汇编时先确认地址码指向的是数值、地址还是地址的地址再数访存次数。坑四MIPS 计算单位不统一。现象是算出的 MIPS 大得离谱或小得离谱。原因是主频用了 MHz 却按 Hz 代入或者 CPI 用了整数忽略了平均值。解决是统一用 Hz 和浮点 CPI算完和量级对照一下。坑五把操作系统的命令当成机器指令。现象是讨论“指令”时把ls、cd和ADD、LOAD混在一起。原因是“指令”这个词在不同层含义不同。解决是明确语境操作系统层叫命令指令集层才叫指令两者不在一个层次。提示这五条里前两条属于数制与编码第三条属于指令第四条属于系统性能第五条属于分层概念。遇到问题时先归类再按对应章节的方法排查。7. 把这份课件变成自己的知识地图一个可复用的整理方法学完这些内容真正拉开差距的不是记住了多少定义而是能不能把零散知识点整理成一张可检索、可验证的地图。我自己的习惯是每学一个计算机基础概念就逼自己回答三个问题它在哪一层、它向上提供什么接口、它向下依赖什么。回答不出来说明还没真正理解。具体做法是建一个 Markdown 表格列四栏概念、所属层、向上接口、向下依赖。比如补码所属层是数制与编码向上提供有符号整数表示向下依赖二进制位运算。指令所属层是指令集层向上提供编程接口向下依赖微架构的数据通路。这个表填满的过程就是把“计算机基础知识--普及.ppt”从课件变成自己知识体系的过程。再进一步给每个概念配一个可运行的最小验证。数制配进制转换代码补码配位运算代码指令配模拟器性能配 MIPS 计算。能跑通才算真的掌握。这个方法不依赖任何特定课件换一本教材、换一个考点照样能用。最后一个技巧定期用“反向提问”检验自己。比如问“如果补码改成反码会怎样”“如果指令没有操作码会怎样”“如果操作系统不抽象内存会怎样”。这些问题没有标准答案但能逼你把各层之间的关系想清楚。我自己就是靠这个习惯把当年背了就忘的计算机基础变成了后来排查问题时能直接调用的底层直觉。希望帮到你。本文还有配套的精品资源点击获取