大家的C语言-100-计算机是如何工作的

为什么要介绍计算机是如何工作的

C语言是一种与计算机底层较为紧密的语言。因此在学习C语言之前必须理解透计算机底层,这样才能理解如指针这样的概念,学习起来就会事半功倍。

很多C语言教程之前也会介绍计算机的工作原理,但是又介绍的不够透彻。也使读者在理解C语言上存在困难。因此我将尽力把计算机工作原理中对理解C语言有用的部分给大家讲清楚。

计算机科学诞生于国外,所以很多资料都是从外文翻译过来的,翻译过程中一些概念模糊不清。如process和procedure都翻译成程序,source code 和 code 都翻译成代码。由于概念不清导致读者在学习时感到困惑。所以我想通过本部分,让读者清晰地理解本教程中的一些概念。如:指令、数据、内存地址、翻译器、操作系统、源代码文件、可执行文件、程序等。

简单的电路

下面是一个最简单的电路,由一个小灯泡、一个电源和两根导线组成。只要电源能提供能使小灯泡发亮的电流,小灯泡就会一直发光,如论是白天还是晚上。

大家的C语言-100-计算机是如何工作的

这带来了一个问题,如果我现在不需要小灯泡发光、但又不想破坏电路,以便在需要灯光时迅速地让小灯泡再次发光该如何做呢?

大家的C语言-100-计算机是如何工作的

答案是加个开关就可以了。加入开关后除了能控制小灯泡外,我们还可以通过电路来表示数字了。可以这样规定开关闭合小灯泡亮时表示1,开关断开小灯泡灭时表示0。但这个电路只能表示两个数0和1。如果要表示更大的数需要增加灯泡的数量。

大家的C语言-100-计算机是如何工作的

又接了两个灯泡后,三个灯泡就可以表示三位数了,因为每位可以表示两个数,因此可以一共表示8个数:000、001、010、011、100、101、110、111。

二进制数

上面的数字与我们平时使用的十进制数不太一样,我们需要把两者对应起来,如下表:

电路能表示数字 十进制
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7

 

 

 

 

 

 

 

 

 

由上表可以看出由于电路能表示的数字每位最大能表示1,因此超过1就需要向前进一位。这与十进制数每位超过9,需要向前进一位的道理是一致的。每位能表示十个数的数字叫做十进制数,那么每位能表示两个数的数字就叫做二进制数。很多教程还介绍了二进制和十进制之间的如何转换。但是我觉得到目前为止还没有必要掌握这项技能,因为在实际工作中根本用不上。十进制数和二进制数之间的转换工作翻译器会帮你完成,而实际工作中用到的更多的是十六进制数。关于十六进制我会在之后为大家介绍,目前大家只要理解什么是二进制数就可以了。

计算器

这部分内容,与上部分内容之间存在一定的跳跃性,但要讲清楚需要很长的篇幅(都可以另起一个教程了),并且内容与学习C语言关系不大,因此直接略过。如果向深入理解,给同学推荐两本书。一本是国内的《穿越计算机的迷雾》,一本是国外的《CODE》。两本数都非常优秀,建议如果英语比较好,可以直接读《CODE》的英文原版,因为可以同时学习一些计算机相关的英文表达。如果英语不好可以选《穿越计算机的迷雾》。不建议选翻译后的《CODE》,一般在有选择的情况下我都不建议读翻译或编著的书,因为通常译者和编者通常都不理解书的内容,导致书的内容很混乱。

虽然存在跳跃性,但是不要慌张,跳过那部分内容不会给理解C语言带来任何问题。同学们只要知道电路可以会被设计的无比复杂,以至于我们可以用开关来控制它做数学运算。

大家的C语言-100-计算机是如何工作的

如上图,中间的计算机就是一个无比复杂的电路。它有6个开关。其中三个属于控制端,控制端用来控制电路的功能和状态。另外三个属于输入端,输入端用来向电路输入运算时需要的数据。计算器内部有一个寄存器,可以理解为三个电容。每个电容充满电荷表示1,释放完电荷表示0,因此存储三位二进制数。输出端可以理解为三根导线,导线上有电压时表示1,无电压时表示0。

控制端有三个开关,可以表示8个数。本例中只使用其中地4个,如下表:

作用
000 使计算器的输出端,寄存器都为000
001

输出端保持不变,将输入端的数保存到寄存器中

010 保持输出端和寄存器不变
011 计算输入端与寄存器的和,结果输出到输出端

这样我们就可以利用这个电路进行数学运算了。下面说明一下该电路如何计算2+1。

  1. 控制端设置成000,此时寄存器和输出端都是000。
  2. 输入端设置成010(十进制数的2,也就是被加数)。此时寄存器和输出端都是000
  3. 控制端设置成001。此时寄存器为010(保存了输入端的值)。输出端为000。
  4. 控制端设置成010。此时寄存器和输出端的值无变化。‘
  5. 输入端设置成001(十进制数的1,也就是加数)。由于控制端是010所以此步输出端和输入端的值也无变化
  6. 控制端设置成011。此时输出端的值为010+001 = 011。也就是十进制数3。

这里明确两个概念 数据指令。由控制端的数是用来控制计算器如何工作的,因此将控制端的数称为指令。而输入端的数是用作运算的,因此称为数据。由此可知无论是指令还是数据,实质上都是数,只是使用方式不同而已。

通过以上介绍相信同学们已经对计算机是如何工作的,有了一个感性的认知。然而计算2+1等于3的问题,使用计算机需要六步才能完成,还不如我们自己算的快,而且还得保证按顺序设置开关的状态,一步做错会就会导致不可预料的结果。但勤能补拙,下一篇我会介绍一下如何提高计算器的工作效率。以及CPU、内存、程序、代码的概念。