第三节 · 本源之论 · 基础计算机知识扫盲
在正式深入学习 C++ 之前,我们需要先了解一些关于计算机的基础知识。这些知识将帮助我们更好地理解程序是如何工作的。
也许你会觉得这些内容枯燥无味,但请相信我,它们是你日后深入学习编程的重要基石。
二进制:计算机的语言
我们日常生活中使用的是十进制数——0、1、2、3、4、5、6、7、8、9,逢十进一。这是因为人类有十根手指,用十进制数数最为方便。
然而,计算机却不是这样"想"的。计算机的世界里只有两种状态:有电和没电,开和关,1 和 0。这就是二进制——只用 0 和 1 两个数字,逢二进一。
让我们来看看十进制数是如何用二进制表示的:
0
0
1
1
2
10
3
11
4
100
5
101
6
110
7
111
8
1000
看出规律了吗?每当数字翻倍时,二进制表示就在左边多一个 1。
将十进制转换为二进制的方法是除二取余法:不断地将十进制数除以 2,记录下每次的余数,然后将这些余数从下往上排列,就得到了二进制数。
例如,将十进制数 13 转换为二进制:
13 ÷ 2 = 6 ······ 1
6 ÷ 2 = 3 ······ 0
3 ÷ 2 = 1 ······ 1
1 ÷ 2 = 0 ······ 1
从下往上读:1101
所以,十进制的 13 在二进制中表示为 1101。
比特与字节
在计算机中,一个二进制位称为一个比特(bit),它是信息的最小单位,只能是 0 或 1。
然而,单独一个比特能表示的信息太少了。我们通常将 8 个比特组合在一起,称为一个字节(byte)。一个字节可以表示 $2^8 = 256$ 种不同的状态,也就是 0 到 255 之间的数字。
更大的单位则有:
1 KB(千字节)
1024 字节
1 MB(兆字节)
1024 KB
1 GB(吉字节)
1024 MB
1 TB(太字节)
1024 GB
为什么是 1024 而不是 1000?因为 $2^{10} = 1024$,这在二进制世界中是一个很"整"的数字。
内存:程序的工作台
当你运行一个程序时,程序的代码和数据都会被加载到内存(Memory)中。内存可以被看作是一个巨大的、由无数个小格子组成的储物柜,每个格子都有一个唯一的编号——也就是地址。
内存的特点是:
速度快:CPU 可以非常快速地读写内存中的数据。
易失性:一旦断电,内存中的数据就会丢失。
我们在程序中声明的变量,实际上就是在内存中"租用"了一小块空间。当程序运行结束后,这些空间就会被释放。
硬盘:数据的仓库
与内存不同,硬盘(Disk)用于永久存储数据。即使断电,硬盘中的数据也不会丢失。我们的程序文件、文档、图片、视频等都存储在硬盘上。
硬盘的特点是:
容量大:可以存储大量数据。
持久性:数据不会因断电而丢失。
速度相对较慢:比内存慢得多。
当我们运行程序时,程序首先从硬盘加载到内存中,然后才能被 CPU 执行。
CPU:计算机的大脑
CPU(Central Processing Unit,中央处理器)是计算机的"大脑",负责执行程序中的指令。它可以进行算术运算、逻辑判断、数据传输等操作。
CPU 的工作过程可以简化为以下几步:
取指令:从内存中读取下一条要执行的指令。
解码:理解这条指令要做什么。
执行:执行这条指令。
写回:将结果写回内存或寄存器。
这个过程不断重复,直到程序结束。
从源代码到可执行程序
我们用 C++ 写的代码被称为源代码。源代码是给人看的,计算机并不能直接理解。要让计算机执行我们的程序,需要经过以下步骤:
预处理:处理以
#开头的预编译指令,如#include。编译:将源代码翻译成汇编代码。
汇编:将汇编代码转换为机器码(目标文件)。
链接:将目标文件与库文件链接,生成最终的可执行程序。
这整个过程通常被简称为"编译",由编译器自动完成。我们只需要一条命令,就可以从源代码得到可执行程序。
程序是如何运行的
当我们双击一个可执行程序,或在命令行中运行它时,操作系统会:
为程序分配一块内存空间。
将程序的代码和数据从硬盘加载到内存中。
让 CPU 从程序的入口点(即
main函数)开始执行指令。程序运行结束后,回收分配的内存空间。
这就是为什么每个 C++ 程序都需要有一个 main 函数——它是程序的入口点,是一切开始的地方。
有符号数与无符号数
还记得我们说过,一个字节可以表示 0 到 255 之间的数字吗?那负数怎么办?
计算机使用补码来表示负数。在补码表示中,最高位(最左边的位)被用作符号位:0 表示正数,1 表示负数。
以一个字节为例:
无符号数:全部 8 位都用于表示数值,范围是 0 到 255。
有符号数:最高位表示符号,范围是 -128 到 127。
这就是为什么 C++ 中有 int 和 unsigned int 之分——前者可以表示负数,后者只能表示非负数,但正数的范围更大。
了解了这些基础知识,我们就能更好地理解 C++ 程序是如何工作的了。在后续的学习中,我们会不断地用到这些概念。
现在,让我们继续前进,探索 C++ 的世界!
Last updated