教程 - 软件 - 文章 - 论坛

::白话C++::

理解——什么是计算机语言

没错,咱们的目标是“理解”,而不是不切实际的“精通”。

前一节讲到,编程就是用计算机能够理解的语言,来表达人类用于解决问题的规则。那么,什么是计算机能够理解的语言呢?

计算机理解什么语言?

不妨先来想想,什么是人类所能理解的语言。譬如你要对你女朋友表达心声,你会说什么呢?说“我爱你”,是吧?不过前提是你女友是个中国人,或者是个懂汉语的外国人,至少至少,在她的脑海里应该懂“我爱你”这三个汉字。

我们要掌握一门自然语言(比如汉语、英语等),就得掌握这门语言的基本词汇。对于汉语来说,是必须学会两千来个汉字,对于英语,则除了掌握26字母之外,同样也要有2千来个单词量。那么,计算机的语言,其实也有是其基本词汇和字母的。假设我们把计算机语言比喻成英语,那么它该有几个字母呢?

答案是两个:0和1。为什么是两个呢?

我们说过,计算机语言是“说”给计算机“听”的,而不是给人听的,因此,当然是如何有利于计算机理解,就如何定义了,很快我们就会明白,计算机其实很笨,它所能理解的字母,最适合的数目就是两个。

中国人把计算机叫成“电脑”,清楚地表明计算机其实也是一种电器,因此大家或许可以猜测得出,计算机能够“计算”的基础,也依赖于“电”。那么电的状态,最清楚的就是两种:一种是通电,一种是断电;如果用“通电”表示1,用“断电”表示0,那么0和1就是计算机的两个“字母”了。事实上,计算机内部所有的一切数据,都是用0和1表达的,包括你现在正在看到的这篇教程网页,或者是你用Word打的文档,或者是你在计算机听到的MP3,或者是你拿数码相机拍下的照片然后传到电脑中……一切的一切,都是0和1表达的。

你可能表示怀疑,因为说到电的状态,你会说,应该不会仅有两种状态啊?没错,比如从电压上区分,就可以分为无数种状态,1伏电、2伏电、3伏电……咱们国家通行的家电工作电压就是220伏,而听说前苏联的,就是110,区分得很清楚啊?

除了按电压高低分,当然也可以按电流强弱分,但事实上这些区分方法都行不通。计算机故名思义,最主要的目的是用于“计算”,而计算的内容,无论是用于航天飞机神五的发射,还是用于公司计算你的工资,显然一丝一毫的错误都是犯不得的,总之是要精确。如果用电压或电流来表示它的语言,试想你家的电压何时是精确的220伏呢?家电,比如灯泡,电压低了,无非是暗点,电压高了,大不了是灯泡烧了,但要用于来计算,又如何区分得出,多少的亮度是标准的220伏?多少又是219伏呢?如果用来表达的“字母”都含糊不清,无法量化,那么计算机工作起来,岂不成了强迫一个从来不识汉字的老外,逼着他表达汉字的四声?

结论是,只能用“通电”和“断电”来表达,是“最清楚而绝对”了……

现在卖的很多计算机,都不提供了软盘了,这样一来,可能在电脑身上最后个直观的,有关0和1的计算机语言的实际例子,就要成为历史了……如果你还有幸能看到软盘,那么就可以看到软盘身上有一个小小的开关,打开它,这个软盘就可以被计算机写进数据;关上它,则变成“只读”,表示这张盘暂不让写数据进去(但可以读出数据)。而在开与关之间,其实计算机就是通过往那个位置照射光线,如果通透过,就表示开着,不通光线,就表示关着。这里光线的穿透与否,和电流的“通”或“断”,完全是一个意思,也是0与1之间的,绝不含糊的关系。

这样,如果我现在告诉你,在计算机诞生后的很长一段时间以来,程序员写程序,其实是不需要计算机的,你可能就不会痛骂我是骗子了……那时的程序员,不过是拿着一卷长长的纸条,然后再拿支笔在纸条上画圈圈……画完以后,程序员有专门的“秘书”(一般是女的噢……多幸福啊~~),负责在纸上有圈圈的地方打个孔,然后将长长的纸卷塞入当时的计算机,计算机就开始“读”程序了。至于它是如何理解的,相信你已经明白了:无非就是用光束照射纸卷,有孔的地方透光,是1,没孔的不透光,是0——或者是相反——反正就是这个意思。

接下来的问题是:光有0和1这两个“字母”,足以表达出所有规则吗?

什么是二进制?

基本概念

黑和白,描述不了世界的绚丽多彩。

好和坏,衡量不了人间的善恶美丑。

那么,0和1,怎么可能表达大千世界的万事万物呢?

欲知其中原由,可得听好了,“易经云:无极生太极,太极生两仪,两仪生四象,四象生八卦……”停!我已经看到有些同学直奔菜市场买鸡蛋和西红柿了;我们还是来讲二进制吧。

什么叫二进制?先想想什么叫十进制?

所谓十进制,就是阿拉伯数字中,只有0,1~9,而没有十这个数字,要表达“十”,就必须用两位的“10”来表示,在小学算术中,这叫“进位”(我保证,学《白话C++》绝对用不上大学的任何数学知识,但是小学算术越精通越好)。

人类为什么采用的是10进制呢?原因是因为人类有双手,有10只指头。想像一下,如果我们只有8个指头,那么现在大家在用的,肯定8进制。8进制应该是什么样呢?请大家看看,并且回答问题。

0,1,2,3,4,5,6,7

10,11,12,13,14,15,16,17

问题1,为什么第一行只有0~7而没有8呢?因为现在是8进制,逢8就得进位,所以没有8这个数。

问题2,请问,第二行的第一个数10(读“幺零”,而不是“十”),相当于10进制的哪个数呢?回答:相当于十进制里的8。依此类推,11相当于9;12相当于10;13相当于11……

问题3,请问8进制里的73,相当于十进制里的哪个数?掰着手指头从10开始算起,显然是笨拙的。我们需要从“位和权值”学起。

位和权值

先看十进数123,它代表的是: 123 = 1*100 + 2*10 + 3*1。 (* 表示乘号×)

对十进数,虽然我们习惯从右向左,称其位数为“个位数、十位数、百位数……”,但为了对不同进制的数都有个统一的称呼,我们首先要对位的称呼做个约定。约定如下:

从右向左,依次称呼为0位、1位、2位。注意,是从0开始。

比如十进数123,本来我们称呼其中2为十位数,现在我们称它为第1位数。

然后我们指出,对于10进制数,假设它的第N位是V,那么V所代表的值,就是 V * 10的N次方。设定我用10^N表示10的N次方,那么前面的算式:

123 = 1*100 + 2*10 + 3*1。也可以表达为:

123 = 1*10^2 + 2*10^1 + 3*10^0。

1在第2位,权值是10的2次方,即100;2在第1位,权值是10的1次方,即10;3在第0位,权值是10的0次方,即1(任意数的0次方值为1,没忘吧?)。

10进制数如此,那么其它进制的呢?首先为了方便区分,我们在一个数后面加一对括号来标明它的进制,比如:

123(10)表示这是一个10进制的123;而73(8)表示一个8进制的73;1101(2)则表示1101是2进制的。

先来看8进制,同样地,对于8进制数,假设它的第N位是V,那么V所代表的值,就是 V * 8的N次方。例如:

5(8) = 5*8^0 = 5(10)。可见,第0位上面的0~7,在8进制里的意义没有改变。

10(8) = 1*8^1 + 0*8^0 = 8(10)。 即8进制的10,等于10进制的8。

73(8) = 7*8^1 + 3 = 59(10)。

123(8) = 1*8^2 + 2*8^1 + 3 = 64 + 16 + 3 = 83(10)。

再看来2进制:同样地,对于2进制数,假设它的第N位是V,那么V所代表的值,就是 V * 2的N次方。

0(2) = 0(10)。当然。

1(2) = 1 * 2^0 = 1。其实不用算,也是当然。

接下是什么数?2吗?肯定不是,在二进制的世界里,逢2进1,所以不可能出现2和2以上的数字;这和8进制数里不会出现8和9是一个道理。那么,二制数里,2及2以上的更多数值,如何表达呢?

10(2) = 1*2^1 + 0 = 2(10)。

11(2) = 1*2^1 + 1 = 3(10)。

100(2) = 1*2^2 + 0 + 0 = 4(10)。

101(2) = 1*2^2 + 0 + 1 = 5(10)。

110(2) = 1*2^2 + 1*2^1 + 0 = 6(10)。

实际上,2的N次方很容易口算出,所以下面这么写,相信大家也能理解:

111(2) = 4 + 2 + 1 = 7(10)。

1000(2) = 8 + 0 + 0 + 0 = 8(10)。

……

1111(2) = 8 + 4 + 2 + 1 = 15(10)。也就是说,在二进制中,占用了4位的1111,其实际大小才等于十进制里的15而已。相信大家对此不会奇怪,因为经过上述说明,我们了解到,二进制数每一位上面的权值,2的N次方,而十进制数里,同样第N位数,其权值是10的N次方:十进制每一位上所能表达的数目个数,比二进制要多得多。可怜的二进制,谁让它的手里只有两张牌呢?

结论

26个英文字母,可以通过组合成无穷多个单词,再组成句子从而来表达这个丰富多采的世界。同样,我们博大而优美的汉语,其基本元素,其实只不过是一些用于形成字的若干个基本笔划。

在计算机世界里,它的语言基本元素只有0和1;但是通过学习二进制的基本原理,我们发现,0和1和0~9一样,同样可以组成无穷个数字。进而用这无穷个数字来表达世间万物。

用“数字”来表达事物,你有些怀疑是吗?想想中国有十数亿人口,你叫张三他叫李四,可是我们大家都有一个“数字”的名称,那就是我们的身份证号。用汉字来表达人名,直观是直观啦,不过很难控制不重名,说起重名,烦呢,可是用数字来表达人名,要控制不重名,就大为简易了。所以说,用数字来作为“语言”,虽然有些不便,但其优点同样明显。

身份证号很长?呵呵,我想你能理解为什么身份证号会这么长。相对于不同的汉字数千个,身份证号所用的数字,只有0~9以及一个X。要用10个元素来不重复地表达数亿人,当然需要长一些的位数。

结论是,计算机的语言,就是二进制的数。你现在屏幕上的看到教程,你听到MP3,你看的Flash动画或视频,它们其实全部是用0和1表达的。

只用0和1来表达这个世界,天啦,计算机界的先哲们真是富有创意!此时再想想我们上千年前的老祖宗,能够用黑白两色的太极图来表达这人世间;用够说出“无极生太极,太极生两仪,两仪生四象,四象生八卦,八卦演万物!”这样富有计算机哲理的话,我们能不肃然起敬吗?

太极图

买了鸡蛋和西红柿?走,回家做道汤吧,西红杮鸡蛋汤,鲜美着呢。

版权所有 谢绝复制。作者:南郁(nanyu) www.d2school.com