第三节 · 本源之论 · 基础计算机知识扫盲

在正式深入学习 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 的工作过程可以简化为以下几步:

  1. 取指令:从内存中读取下一条要执行的指令。

  2. 解码:理解这条指令要做什么。

  3. 执行:执行这条指令。

  4. 写回:将结果写回内存或寄存器。

这个过程不断重复,直到程序结束。


从源代码到可执行程序

我们用 C++ 写的代码被称为源代码。源代码是给人看的,计算机并不能直接理解。要让计算机执行我们的程序,需要经过以下步骤:

  1. 预处理:处理以 # 开头的预编译指令,如 #include

  2. 编译:将源代码翻译成汇编代码。

  3. 汇编:将汇编代码转换为机器码(目标文件)。

  4. 链接:将目标文件与库文件链接,生成最终的可执行程序。

这整个过程通常被简称为"编译",由编译器自动完成。我们只需要一条命令,就可以从源代码得到可执行程序。


程序是如何运行的

当我们双击一个可执行程序,或在命令行中运行它时,操作系统会:

  1. 为程序分配一块内存空间。

  2. 将程序的代码和数据从硬盘加载到内存中。

  3. 让 CPU 从程序的入口点(即 main 函数)开始执行指令。

  4. 程序运行结束后,回收分配的内存空间。

这就是为什么每个 C++ 程序都需要有一个 main 函数——它是程序的入口点,是一切开始的地方。


有符号数与无符号数

还记得我们说过,一个字节可以表示 0 到 255 之间的数字吗?那负数怎么办?

计算机使用补码来表示负数。在补码表示中,最高位(最左边的位)被用作符号位:0 表示正数,1 表示负数。

以一个字节为例:

  • 无符号数:全部 8 位都用于表示数值,范围是 0 到 255。

  • 有符号数:最高位表示符号,范围是 -128 到 127。

这就是为什么 C++ 中有 intunsigned int 之分——前者可以表示负数,后者只能表示非负数,但正数的范围更大。


了解了这些基础知识,我们就能更好地理解 C++ 程序是如何工作的了。在后续的学习中,我们会不断地用到这些概念。

现在,让我们继续前进,探索 C++ 的世界!

Last updated