计算机之所以强大,是因为它能够世界上的各种模型通过数来存储在机器内,并且能够对这些数进行处理。抽象的东西看起来虽然和现实世界的物体关联不大,但是计算机可以用各种模型来模拟各种现实的东西。比如音乐播放器,办公软件,甚至某些仿真软件,甚至模拟人的大脑。

学习计算机内部的数据存储形式,有助于理解计算机是如何工作的。我们学习编程的时候知道,一般都会有一些基本数据类型,编程的时候只管用就可以了。比如int 型,可以进行各种四则运算操作。从这里引申开来,联系一下我们平时学习的基本数据类型有short int,int,long int ,float ,double.等等,这些都是计算机对数的表示形式,对应于硬件层面的短整型、整型……,但是数据在计算机里面到底是怎样存的呢?

计算机里面有一些数据类型,这些数据类型就是各种数据表示的本原。比如在内存中,一个定点类型(即一段连续的内存单元)可以容纳若干位二进制。依据这段内存单元的长短又可衍生出各种表示方式。对于浮点型(所谓浮点就是用小数点的位置浮动来变化数的表示,它的浮动体现在次数的变化上)的表示也相似,只是用其中的一段表示“阶码”——即指数,而剩余的部分除却最高的符号位之后都是尾数(实则是主干)对于32位的浮点数来说。意料之中,对于不同的要处理的对象,需要有不同的数据类型作为支撑,也就是说没有这个类型,cpu不支持这种操作,那么就不能直接操作这种数据。其实很多时候我们需要自己用软件的方式来实现更多数据表示方式——数据结构。这也从一方面体现软件与硬件的逻辑等效,硬件能做的,通过软件也能做,当然是指在有一定的硬件基础的时候。

当然我们平时也遇到很多计算机不能直接处理的,比如我要进行一个大数的运算:1000!;用long long 根本就不够。所以我们需要构造新的数据类型,可能我会用链表来存这个数,但是这个数还是以cpu可以运算的形式来存储的。比如我用一个节点Node来容纳这个big数的4位,每当这四位满了之后,我就进位。这其实是用程序实现一定的数据结构来表示这个数,用软件来模拟硬件的一些功能(比如上面说的进位)。

硬件不是万能的,但是没有硬件是万万不能的。硬件就是一种容器,可以装下一些集合。而这些集合必定是有限的,因为内存等系统资源是有限的。为了最大限度地模拟数学中的各种数的集合,以及便于模拟数的各种操作。所以在硬件的基础上设立了各种数据类型,也做了相应的规定。要进行整数的计算就必须要有×××数据类型,而为了进行小数的计算,就要有创造浮点型的数据类型。总之就是要什么就创造什么,咱们学校不是流传着这么一句话吗:图书馆没有书自己买,实验室没设备自己造,没有条件创造条件也要上!

所以对于比较通用的计算机需要更多的指令,因为要处理各种不同的数据类型。我们家用电脑,经常用来作为娱乐工具,为了使计算机处理多媒体更加高效,就把它的要求上升到硬件层次,让cpu能够直接处理多媒体的数据(又一种新的数据类型诞生了),这样软件实现就轻松一些。

而普天之下苦命的程序员,现在还要把那数学中的种种变成机器可以处理的数据结构。唉,那些指针指来指去的(就像一个人用手指指来指去,而我却像×××一样快速地摆着头,看它到底指哪里去了),实在是比数学还要难缠。不过学会了这些东西,不仅数学会有很大提升,就连打字速度都有很大提高呢 : P

对于数据结构,什么样的东西对应什么样的操作,最终也就会有怎样的ADT(抽象数据类型)。对于硬件来说,做硬件的都是有限公司,不能造出无限资源的计算机。不知道若干年后,经过我们这些年轻一代的努力,能不能用有限的资源创造出无限的可能。

 

2011-09-07   晚安    bibodeng