认识编程:以Python语言讲透编程的本质
上QQ阅读APP看书,第一时间看更新

1.3 计算机只有两根手指?

1.3.1 为什么偏偏是二进制?

首先的一个疑问就是为什么要用二进制?为什么不采用人类习以为常的十进制?这与计算机的构造有关系。计算机开始用的是机械,后来是机电设备,再后来是电子元件。使用这些器件,表示两种状态比较方便、简单,比如高低、开关、断通,天然地适合二进制。另外,二进制的运算规则比较简单,使计算机硬件结构大大简化(一个明显的事实是十进制乘法口诀有81条公式,而二进制乘法只有4条规则),二进制更合适。

来看一个二进制表示的数11001。

套用上面的求值公式,结果是N=16+8+0+0+1=25(用十进制表示的25)。

再来看一个二进制表示的实数101.11。

套用上面的求值公式,结果是N=4+0+1+0.5+0.25=5.75(用十进制表示的5.75)。

以上两个例子是正数,负数又如何表示呢?当然最直观的想法就是加上特殊符号表示正负数,相当于+和-。但是其实计算机内部并不是这么表示的,为了运算方便,计算机内部采用了一种补码的方式表示正负。如00110100,补码为11001100。规则就是把每一位二进制先取反(0变成1,1变成0),然后加1。

有了补码,计算机按照这个原则存储数字,先把十进制数变成二进制,然后看是不是正数,如果是,原封不动存储,如果是负数,则以补码存储。反过来,对存储的一个二进制数,如果最左边一位是1,则当成负数,求补码后得出原数,如果最左边一位是0,则是正数,直接得原数。

这种看起来奇奇怪怪的表示法,其实是一种相当聪明的办法,补码系统会简化运算。

实际的数字存储需要考虑到计算机组成器件的限制,如整数有最大值限制、小数有精度限制。IEEE制定了标准,以一种确定的格式和长度来存储整数和实数,表示正负数。

除了二进制,使用比较多的还有八进制和十六进制。它们之间的转换比较简单,三位二进制数对应一个八进制数字,四位二进制数对应一个十六进制数字。

几种进制之间的符号对照表如下。

如何把一个数在几种进制之间转换?其他进制转成十进制比较简单的,可以直接套用上面的公式。反过来则比较麻烦,简单地说是整数部分连除而小数部分连乘,手工计算很麻烦,后面章节会教读者编写一段程序来进行转换。

1.3.2 计算机与十进制

读者肯定会问,计算机用二进制表示数字,编写程序时真的要这么麻烦吗?答案是不用,程序仍然是用十进制来编写。

那这是怎么回事?计算机怎么能认识十进制数并进行各种计算的?

实际情况是,在计算机执行程序和人编写的程序中间有一个中间程序,叫编译程序或解释程序,它负责把人编写的程序翻译成计算机能识别的指令集合。这样做的目的是为了简化人类的工作(事实上,当时的计算机很大,有一个房子那么大,最早的程序员就是直接用的机器指令编写程序的,第一批程序员钻进计算机里面拨弄开关、连线,通过这种方式编写程序)。程序员只要按照编译程序的规定编写命令即可,而随着时代的进步,这种编写命令的方式越来越接近于人类的自然语言,编写程序的工作确实大大简化了。这些编译程序各有各的规定,即它们规定了一种人造的语言:编程语言。现在使用的编程语言至少数百种,主流的不下十种,Python就是其中之一。