快捷搜索:  汽车  科技

计算机存储位置的表达(计算机内信息的表示与存储)

计算机存储位置的表达(计算机内信息的表示与存储)由于每个二进制位只能表示0和1两种状态,要想表示超过三种状态,用一个二进制位显然不行。但我们可以用多个二进制位组合起来表示更多的状态,如:两个二进制位的组合可以有00、01、10、11四种状态,刚好对应十进制数0、1、2、3;三个二进制位可以表示000、001、010、011、100、101、110、111八种状态,刚好对应十进制0至7;同理,八个二进制位可以表示的状态数为2*2*2*2*2*2*2*2^8种状态,分别是:00000000、00000001、....、11111111等共256种状态,分别对应十进制数0至255。如果要想表示更大的数或状态,就多用一些二进制位组合起来就行了。以上两个二进制串表示什么,像不像天书,是不是一头雾水!别怕,我带着你一起读懂它们。在读懂上述二进制串之前,让我们再来深入学习一点二进制的知识。二进制串一二进串二:二进制串二

1.2 计算机内信息的表示与存储

上一节介绍了计算机发展及计算机简单的工作原理,引入了二进制的概念,讲解了十进制与二进制之间的转换关系。本节将进一步介绍如何用二进制表示现实世界的事物。

计算机内部的程序和数据都是以二进制表示和存储的,理解和掌握二进制及相关运算,对学习程序设计非常重要,先让我们来看两个二进制串表示的信息。

例1:解析以下二进制串表示的信息

二进制串一:

计算机存储位置的表达(计算机内信息的表示与存储)(1)

二进制串一

二进串二:

计算机存储位置的表达(计算机内信息的表示与存储)(2)

二进制串二

以上两个二进制串表示什么,像不像天书,是不是一头雾水!别怕,我带着你一起读懂它们。在读懂上述二进制串之前,让我们再来深入学习一点二进制的知识。

由于每个二进制位只能表示0和1两种状态,要想表示超过三种状态,用一个二进制位显然不行。但我们可以用多个二进制位组合起来表示更多的状态,如:两个二进制位的组合可以有00、01、10、11四种状态,刚好对应十进制数0、1、2、3;三个二进制位可以表示000、001、010、011、100、101、110、111八种状态,刚好对应十进制0至7;同理,八个二进制位可以表示的状态数为2*2*2*2*2*2*2*2^8种状态,分别是:00000000、00000001、....、11111111等共256种状态,分别对应十进制数0至255。如果要想表示更大的数或状态,就多用一些二进制位组合起来就行了。

一个二进制位又称为1比特(bit),是信息表示的最小单位。8个二进制位组合在一起称为1字节(Byte),这是信息存取的基本单位。要把现实世界的数字、文字、图片、视频和声音等信息存入计算机,首先要把采集到的信息用二进制来表示,这样才可以用计算机存储和传输信息。这种转换过程称为编码。为了存储和传输英文字符,要给每个字符一个惟一的数值或编号,由于英文字符数量较少,使用7个比特就足以表示字符了,如果使用一个字节来表示字符,多出了一个比特,可以用来作为奇偶校验码,这种编码表示就称为ASCII(美国信息交换标准代码),这也是事实上的国际标准。如大写字母A的ASCII码值为65,小写字母a的ASCII码值为97,数字0的ASCII码值为48,空格的ASCII码为32等等。

计算机存储位置的表达(计算机内信息的表示与存储)(3)

有了ASCII码的基础后,我们先把上面第一个二进制串打散,即从第一个二进制位开始,从左到右、从上到下,以一个字节或8个比特为一组分开,二进制串变成了以下形式:

计算机存储位置的表达(计算机内信息的表示与存储)(4)

然后对每个字节逐一进行解码,最简单的方法就是查ASCII码表。如前面两个字节(01010111 01100101),通过查表得到对应的两个字符是:We,所有字节全部查完后,发现“二进制串一”对应的是“We are students”这个句子。

那么,第二个“二进制串”又表示什么呢?如果按ASCII码进行解码,这时我们发现可能得到一系列无意义的字符序列。事实上,一个二进制串可以表示任何东西——文字、图形、声音,一切皆有可能。但只有正确的解码,才能得到正确有意义的结果。

假设已经知道第二个“二进制串二”是一个机器语言程序,解码就稍微复杂些了。我们得了解指令的构成和指令长度、得有程序指令编码表,才能对机器语言程序进行解码。如果一条指令由操作码与地址码构成,如:

指令 = 操作码 地址码

计算机存储位置的表达(计算机内信息的表示与存储)(5)

引自占德臣老师《大学计算机》

查表可知:“000001”为取数指令、“000010”为存数指令、“000011”为加法指令、“000100”为乘法指令、“000101”为打印指令、000110为停机指令。

设一条指令由16个二进制位构成,前6位表示操作码、后10位表示内存的地址码。我们就可以把第二个二进制串按16位一组分隔,并依次存在地址0至地址12的内存单元中,则下图就得到了“二进制串二”对应机器语言程序及相关解释:

计算机存储位置的表达(计算机内信息的表示与存储)(6)

引自占德臣老师《大学计算机》

可以发现“二进制串二”原来是一段二进制程序(从地址0000至地址0111)和数据(从地址1000至地址1011)的组合,实现的功能是计算:

(38 2) * 3 6 或 的值。

我们也可以把“二进制串二”解码为一段文字、一幅图片、一段音频等,但结果可能没有任何意义。因此,二进制串表示的信息由解码器或解释程序决定!

没错,我们也可以把一段文字信息编码为只有自己能理解的形式,比如对自己的私密数据进行加密,只有自己的解密程序才能还原来有信息。

在我们生活的地球上,要找一个朋友或一件物品,或者要去某个地方,首先要先定位以获得地点、朋友、物品的地址,这个地址是用经度纬度标识的,由了地址,可以通过手机APP导航找到目标了。

同样,我们如何在计算机中准确存入或取出数据呢,当然也要依靠地址。因此,需要按顺序对每个内存单元赋予一个唯一的编号,称为内存地址,内存地址也是由多个比特构成二进制串(如上图)。

例1中,我们用展示了二进制如何表示文字和程序。那么二进制数据或程序是如何存放到内存中的呢?内存是一个存放比特串的连续空间,从第0个比特开始依次递增编号直至最后一个比特。为了节约存取效率,我们把一个字节或8个比特作为一个存取单位,对每个字节从0开始依次递增编号,编到最后一个字节为止。把第一个二进制串存入到连续的存储空间的方法是一个字节接着一个字节顺序存入到存储空间中,如图所示:

计算机存储位置的表达(计算机内信息的表示与存储)(7)

从上图中可以看出,地址也是由一串二进制位构成的。本例使用了8个比特表示地址,这个地址能表示的存储单元是多少呢?由于地址的范围从00000000到11111111,也就是8个比特表示的存储单元数刚好是(256),所以只能保存很少的信息。为了访问更多的存储单元,地址位数要相应增加,如16位地址、32位址位等。

16位地址可以访问的存储空间的地址范围从0至-1,32位地址可以访问的存储空间的范围是0至。

1字节虽然可以表示0至255的数,但对于实际问题来说还是太小。如果想存储更大的数据,如:比655或更大的数,1个字节显然不行,我们可以用2个字节或4个字节来表示一个整数,这样可以存放更大的整数。以下我们再介绍一下几个存储容量的单位。

首先是“字”的概念。字是计算机中特殊的单位,表示计算机中央处理器一次可以处理的比特数,字的比特数称为“字长”,一般16位计算机字长就是16比特,32位计算机机的字长就是32比特,现在计算机普遍是64位的,字长是64比特。字长越长,计算机性能越高,因为同时可以处理的二进制位数更多。

除了字节,存储容量的单位通常以(1024)为增长倍数。如果把一字节看成是一粒米的话,直观上看,每个单位的存储容量对应的米的数量是多少呢? 一位德国专家给出了答案:

1B

1厘米

1KB=B=1024B

1碗米

1MB=KB=1024KB=B

8袋米

1GB=MB=1024MB=B

3货车米

1TB=GB=1024GB=B

1个集装箱货运船

1PB=TB=1024GB=B

铺满整个曼哈顿

1EB=PB=1024PB=B

铺满整个美国

1ZB=EB=1024EB=B

填满整个大西洋

1YB=ZB=1024ZB=B

相当于整个地球

从表中可以看出,1 BTYE虽小,但多个BYTE组合在一起后,却能够表示整个地球甚至宇宙的所有事物!

因为英文字符个数较少 计算机用一个字节(ASCII)表示一个英文字符就可以了。但要存储或传输入一个汉字用一个字节可以吗?

出现频度最高的一级汉字有3755个,二级汉字3008个,一、二级汉字共有6763,加上常用符号,差不多7441个汉字符号,基本包括了99%以上常用字。由于一个字节最多只能表示256种状态,因此一个字节不能做到给每个汉字一个编码,可以考虑用两个字节组合在一起表示一个汉字。每个字节只用到第7位,最高位为0,这样只用两个字节的14比特表示汉字,可以表示汉字的数量为=128*128=16KB,约1.6万个汉字。这种编码,称为汉字国标码(GB2312-80编码),为了在内存中区分汉字与英文编码,通常把国标码的每个字节的最高位置1,称为机内码

国标码:

0

0

B15

B14

B13

B12

B11

B10

B9

B8

B7

B6

B5

B4

B3

B2

B1

B0

机内码:

1

1

B15

B14

B13

B12

B11

B10

B9

B8

B7

B6

B5

B4

B3

B2

B1

B0

汉字“我们是学生”的机内码保存在计算机中的样子如图:

地址

内存空间

对应汉字

***01

11001110

***02

11010001

***03

11000011

***04

11000111

***05

11001010

***06

11000111

***07

11010001

***08

10100111

***09

10101001

***10

11111010

“们”的机内码为“1100001111100011”,注意两个字节的最高都位为1,而国标码为“0100001101000111” 两个字节的最高位都为0。

机内码或国标码主要是用于汉字存储和传输,要在屏幕上显示汉字,可以使用字形码。字形码是汉字的图形符号,通常用16X16或24 X 24点阵来表示汉字形状,以24X24为例,表示一个汉字由24行,每行24个像傃点。汉字字形中有颜色的像素用1表示,没有颜色的地方用0表示。因此,一个24点阵汉字需要576个比特或72字节表示,占用存储空间较大,所以字形码不能用来存储或传输,而是以字形库的形式存在本地电脑上,需要使用时,通过国标码在字形库里查表得到字形码并在屏幕上显示。

整数是计算机经常使用的数据,一般分为有符号整数和无符号整数。根据整数的大小,可以有8位整数、16位整数和32位整数的区别。为了简单起见,我们以8位整数为主介绍整数的表示和存储。16位和32位整数的表示与存储方法与8位整数一样。

以下为有符号8位整数的情况:

1

X

X

X

X

X

X

X

B7

B6

B5

B4

B3

B2

B1

B0

对于有符号数而言,B7位表示符号位 当B7位为1时,表示负整数,当B7位为0表示正整数。取值范围为-128(27)至 127(27-1)

X

X

X

X

X

X

X

X

B7

B6

B5

B4

B3

B2

B1

B0

无符号整数最小的数为0(即00000000),最大数为255(即11111111)。
但是,在计算机内部,整数是以补码形式表示和存储的。我们把一个十进制转换成的二进制编码称为原码,对于负数,其原码除了符号位外的每个位都取反得到反码(即0变1、1变0),负数的反码加1得到了对应的补码。对于正数,原码、反码和补码都是一样的。看一下-49和 49的原码、反码和补码分别是什么?先用“辗转相除法”把49转换成二进制,结果为:110001

因为一个整数用8位表示,所以位数不足要在数的前面补0,请注意最高位为符号位,所以有:

49 = 0 0110001

-49 = 1 0110001

根据定义, 49的原码、反码和补码都是00110001。而-49的反码为:11001110,补码为11001111。如果想把负数的补码变成原码,只要补码先减1,然后除符号位外,每位都取反即可。

计算机为什么要使用补码呢?其目的是把减法当成加法来做。以每天见的时钟为例,如果当前时针指向3点位置,如果想调整到11点位置,如何做呢?两种方法:一是把时针反向调4个小时,二是把时针正向调8个小时。也就是说减4的问题可以变成加8来完成,结果是一样。由于4和8相加和是时钟的最大刻度12,因此-4和8的效果一样。看一下补码运算:

运算式“45 - 25”可以写成补码运算:,分别变成8位二进制补码再相加:

0 0 1 0 1 1 0 1

1 1 1 0 0 1 1 1

------------------

0 0 0 1 0 1 0 0

运算结果为: 由于符号位为0,所以得到一个正数,而正数的原码与补码一样,把二进制00010100转换成对应的整数后结果为20。可见,补码是计算机把减法变成加法的一种机制。

定点数是小数点处于默认位置的数。以8位整数为例,如果是定点整数,小数点默认在B0的后面,而定点小数默认在B7和B6之间,B7仍然为符号位。

1

·

X

X

X

X

X

X

X

B7

B6

B5

B4

B3

B2

B1

B0

-0.375的转换成小数是-0.011。变成8位表示的定点小数为-0.0110000 表示成定点小数为:

1

0

1

1

0

0

0

0

B7

B6

B5

B4

B3

B2

B1

B0

其中B7为符号位,小数点默认在B6与B7位之间,该小数在右边位数不足时补0,其值大小不改。49的定点整数存储(小数点默认位于B0之后)如下,小数点在B0之后:

0

0

1

1

0

0

0

1

B7

B6

B5

B4

B3

B2

B1

B0

浮点数指的是小数点位置不固定的数,主要用来表示实数。目前,很多系统大都使用IEEE754标准表示浮点数。

32位单精度浮点数格式为:

计算机存储位置的表达(计算机内信息的表示与存储)(8)

float型数据格式

64位双精度浮点数格式为:

计算机存储位置的表达(计算机内信息的表示与存储)(9)

double型数据存储格式

两种浮点数都分为三个部分:第一个部分称为符号位S 占1比特;第二个部分是指数部分,用二进制指数加偏移值(单精度)或(双精度)后得到;第三部分是尾数部分,表示浮点数的精度,尾数的小数点之前只能有一位且为1,存储尾数时把小数点前的1舍去。

现在让我们把一个实数-254.25以单精度实数与双精度实数分别存储。首先,要把-254.25变成二进制,分别用“辗转相除取余”和“相乘取整法”转换整数和小数部分,再进行规格化处理,得下式:

要把指数111变成浮点数的指数,对于单精度浮点数要加一个偏移值127(1111111) 即指数为00000111 1111111=10000110。对于双精度数要加的偏移值是1023(1111111111),指数为:

00000000111 1111111111=10000000110。

尾数存储相对简单,只要在规格化小数后补足0,使其长度分别达到单精度(23位)或双精度(52位)要求的长度即可。存储时还要把规格化尾数的小数点前面的1舍去,只存小数之后的二进制串即可。

单精度

符号位∶1(1位)

指 数∶ 1111111 00000111=10000110 (8位)

1111111(127)是偏置数

尾 数∶ 1.11111100100000000000000(23位)

去掉小数前面的1,只存小数后的数,不足23位,补0

因此单精度结果为∶

11000011011111100100000000000000(32位)

双精度

符号位∶1(1位)

指 数∶ 111111111 00000000111=10000000110(11位)

111111111(1023)是偏置数

尾 数∶1.1111110010000000000000000000000000000000000000000000(52位)

去掉小数前面的1,只存小数后的数,不足 52 位补0

因此双精度结果为∶

1100000001101111110010000000000000000000000000000000000000000000(64位)

如果想把浮点数二进制数转换成十进制数,先把指数减去127(双精度减1023)得指数k。然后按“1.尾数 * 2k ”变成纯小数形式,再按展开多项式计算即可。

本节讲解了二进制内部信息的表示的方法。介绍了信息表示的单位,原码、反码和补码的计算和表示,讲解了定点数整数、定点小数和IEEE754表示浮点数的方法。本节就讲到这里,下次再见!

猜您喜欢: