计算系统基础(二)

计算系统基础(二)

如果将《计算系统基础》书中的知识点进行粗略划分,可以将其分为c语言和底层部分。c语言的基础语法可以通过网上各类视频进行学习与巩固,在本文中将不再赘述。因此,我们将重点放在对底层的探究和理解。接下来,我们将介绍计算机最基础的“拼音”语法:二进制。

一、为什么要使用二进制?

在前文中,我们解释为:1和0可以准确表示计算机的电路状态。但如果要准确描述其原因的话,不仅仅是因为电路的表达问题。更重要的,是对计算机的表达形式和存储方式进行统一化管理。我们用表示信息存储的最小单元,每个位上只可能是1或0,把许多位组在一起,就可以配合表示不同信息,如8位组合在一起,就可以表示256(2^8)种不同的数,如果人为加以规定,我们就可以用这256种情况表示256个不同的信息。下面从最基础,大学之前已经接触过的二进制整数开始。

二、整数的二进制

1.无符号型二进制数

暂时不考虑正负符号,一位只能存在0或1,那么从2开始的数就应该表示为:10,11,100,101……如果统一规范为8位,30即是00011110,可以自行推导。

2.加上符号以后……

在实际的运算之中大量需要用到负数,那么负数应该如何表示,首先想出的第一种方法,是将开头的一位作为符号表示位,比如0100表示4,那么我们使用1100表示-4。我们将这种表示方式称为原码。除原码以外,还有人想到,我们可以把原来正数的二进制序列全部反转(或称按位取反),即使用1011表示-4,这种方式被称为反码

然而以上两种方法有一个致命缺陷,适用于人脑而不适用电脑,我们在进行运算的时候,可以在脑中将原码反码的负数翻译,再次进行运算,但这一过程对计算机却极其困难。

因此我们需要找出一种存储方式,它必须能满足:1、易于被人脑理解 2、易于计算机的计算

人们终究找出了完美适配这两种需求的二进制表示方式,我们称之为补码

补码的正数表达方式与其他类似,如5表示为0101

但-5表示为1011。类似的,-10表示为10110,-16表示为10000……我们不难发现,补码的负数有一个很大的特点就是它们与原先的正数相加,可以得到0。这将极其有利于计算机对数据的计算。

而对于我们来说,补码的表现形式似乎不好理解。但是前人已经为我们总结出规律:按位取反再加一即可得到相反数。借助这一规律,人脑的逻辑也可以轻易理解补码。因此,补码成为了当今计算机通用的数据形式。

三、小数的二进制

计算机中,我们将“小数”类型的数据,称之为浮点数类型。为了方便存储,我们采用类似于科学计数法的存储机制。举例来说,十进制的5.0,写成二进制是101.0,相当于1.01*2^2.。延续着这个思路,IEEE(国际电气和电子工程师协会)规定:

计算系统基础(二)

我们以c语言中float型单精度浮点数为例,对于32位的浮点数,最高的一位是s,表示0正1负,接着的8位指数为E,剩下的23位为有效数字M。

S只有一位,很好理解。但对于M与E来说,有着特殊的规定:

举例来说,M表示的是1.01011*2^9的小数部分,IEEE 754规定,在计算机内部保存M时,默认第一位总是1,只保存后面的01011部分。这样做可以节省一位有效数字,使只有23位的M可以存储24位的信息。

至于E的情况,比较特殊。

E不仅是无符号整数,更有着特殊的规则。E共有8位,因为无符号,取值范围为0~255。但为了取到科学计数法中的负数,IEEE又规定了一个中间数:127,E的值必须减去127才能表示数据原本类型。对1.01011*2^9,必须保存成9+127=136,即10001010。

然而还有特殊情况:E全为1或全为0。在E全为0时,将E视为真实值并且M省略的最开头数设为0,这样做可以表示一些极其靠近0的小数,如0.000000001

在E全为1时,这时如果有效数字M全为0,表示正/负无穷大。

四、二进制与十六进制

由于二进制表示繁琐且不易理解,我们一般使用十六进制简化表达二进制。每四位二进制对等于一个十六进制数:这是因为四位二进制可以表示0~15,恰好对应十六进制中的0~F,在将十六进制表示为二进制后,再去考虑补码或浮点数等情况。

五、其他

在二进制的章节中,除了上述内容以外,《计算系统基础》一书中还详细提出了二进制和十进制,十进制到二进制及十六进制的转换方式,还有较为重要却易于理解的布尔代数运算,本文只根据书中重难点进行罗列,希望给各位对二进制的理解带来一定的帮助和思考。

猜你喜欢

转载自blog.51cto.com/14930847/2615151