大家的C语言-100-计算机是如何工作的
为什么要介绍计算机是如何工作的
C语言是一种与计算机底层较为紧密的语言。因此在学习C语言之前必须理解透计算机底层,这样才能理解如指针这样的概念,学习起来就会事半功倍。
很多C语言教程之前也会介绍计算机的工作原理,但是又介绍的不够透彻。也使读者在理解C语言上存在困难。因此我将尽力把计算机工作原理中对理解C语言有用的部分给大家讲清楚。
计算机科学诞生于国外,所以很多资料都是从外文翻译过来的,翻译过程中一些概念模糊不清。如process和procedure都翻译成程序,source code 和 code 都翻译成代码。由于概念不清导致读者在学习时感到困惑。所以我想通过本部分,让读者清晰地理解本教程中的一些概念。如:指令、数据、内存地址、翻译器、操作系统、源代码文件、可执行文件、程序等。
简单的电路
下面是一个最简单的电路,由一个小灯泡、一个电源和两根导线组成。只要电源能提供能使小灯泡发亮的电流,小灯泡就会一直发光,如论是白天还是晚上。
这带来了一个问题,如果我现在不需要小灯泡发光、但又不想破坏电路,以便在需要灯光时迅速地让小灯泡再次发光该如何做呢?
答案是加个开关就可以了。加入开关后除了能控制小灯泡外,我们还可以通过电路来表示数字了。可以这样规定开关闭合小灯泡亮时表示1,开关断开小灯泡灭时表示0。但这个电路只能表示两个数0和1。如果要表示更大的数需要增加灯泡的数量。
又接了两个灯泡后,三个灯泡就可以表示三位数了,因为每位可以表示两个数,因此可以一共表示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语言带来任何问题。同学们只要知道电路可以会被设计的无比复杂,以至于我们可以用开关来控制它做数学运算。
如上图,中间的计算机就是一个无比复杂的电路。它有6个开关。其中三个属于控制端,控制端用来控制电路的功能和状态。另外三个属于输入端,输入端用来向电路输入运算时需要的数据。计算器内部有一个寄存器,可以理解为三个电容。每个电容充满电荷表示1,释放完电荷表示0,因此存储三位二进制数。输出端可以理解为三根导线,导线上有电压时表示1,无电压时表示0。
控制端有三个开关,可以表示8个数。本例中只使用其中地4个,如下表:
数 | 作用 |
---|---|
000 | 使计算器的输出端,寄存器都为000 |
001 |
输出端保持不变,将输入端的数保存到寄存器中 |
010 | 保持输出端和寄存器不变 |
011 | 计算输入端与寄存器的和,结果输出到输出端 |
这样我们就可以利用这个电路进行数学运算了。下面说明一下该电路如何计算2+1。
- 将控制端设置成000,此时寄存器和输出端都是000。
- 将输入端设置成010(十进制数的2,也就是被加数)。此时寄存器和输出端都是000
- 将控制端设置成001。此时寄存器为010(保存了输入端的值)。输出端为000。
- 将控制端设置成010。此时寄存器和输出端的值无变化。‘
- 将输入端设置成001(十进制数的1,也就是加数)。由于控制端是010所以此步输出端和输入端的值也无变化
- 将控制端设置成011。此时输出端的值为010+001 = 011。也就是十进制数3。
这里明确两个概念 数据 和 指令。由控制端的数是用来控制计算器如何工作的,因此将控制端的数称为指令。而输入端的数是用作运算的,因此称为数据。由此可知无论是指令还是数据,实质上都是数,只是使用方式不同而已。
通过以上介绍相信同学们已经对计算机是如何工作的,有了一个感性的认知。然而计算2+1等于3的问题,使用计算机需要六步才能完成,还不如我们自己算的快,而且还得保证按顺序设置开关的状态,一步做错会就会导致不可预料的结果。但勤能补拙,下一篇我会介绍一下如何提高计算器的工作效率。以及CPU、内存、程序、代码的概念。