C教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 数据的表示方法

计算机的存储系统由内存和外存组成。内存又可分为RAM(随机存储器)和ROM(只读存储器)。RAM内存用于暂时存放运行的程序和所需数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失。为了便于管理,通常将8位(bit)组成一个基本的内存单元,称为1字节(Byte)。也就是说,一个基本内存单元的大小是1字节。为了便于内存单元的访问,计算机系统还为每一个内存单元分配了一个相对固定的编码,这个编码就是内存单元的内部“地址”。

在介绍C语言的数据类型之前,有必要在这里先来讨论数据的表示方法。

2.1.1 进制的概念

前面说过,计算机内部的信息在内存中都是以二进制形式存放的。那么,什么是进制呢?

1.进制的表示

在计数中,将数字符号按序排列成数位,并遵照某种由低位到高位进位的方法进行计数,来表示数值的方式,称为进位计数制,简称进制。比如,日常生活使用最多的是十进位计数制,简称十进制,就是按照“逢十进一”的原则进行计数的。进制的表示主要包含3个基本要素:数位、基数位权

数位是指数码在一个数中所处的位置。

基数是指在某种进位计数制中,每个数位上所能使用的数码的个数,例如,十进位计数制中,每个数位上可以使用的数码为0,1,2,3,…,9十个数码,即基数为10。

位权是一个固定值,是指在某种进位计数制中,每个数位上的数码所代表的数值的大小,等于在这个数位上的数码乘上一个固定的数值,这个固定的数值就是这种进位计数制中该数位上的位权,即基数的幂次方。数码所处的位置不同,代表数的大小也不同。各位上的权的定义为:小数点左边,从右向左分别是基数的0次方,1次方,……,n次方;小数点右边,从左向右分别是基数的-1次方,-2次方,……,-n次方。

2.十进制

十进位计数制简称十进制;有10个不同的数码符号:0,1,2,3,4,5,6,7,8, 9。每个数码符号根据它在这个数中所处的位置(数位),按“逢十进一”来决定其实际数值,即各数位的位权是以10为底的幂次方。例如:

(273.15)10=2×102+7×101+3×100+1×10-1+5×10-2

3.二进制

二进位计数制简称二进制,有两个不同的数码符号:0,1。每个数码符号根据它在这个数中所处的位置(数位),按“逢二进一”来决定其实际数值,即各数位的位权是以2为底的幂次方。例如:

(11001.01)2=1×24+1×23+0×22+0×21+1×20+0×2-1+1×2-2=(25.25)10

4.八进制

八进位计数制简称八进制,有8个不同的数码符号:0,1,2,3,4,5,6,7。每个数码符号根据它在这个数中所处的位置(数位),按“逢八进一”来决定其实际数值,即各数位的位权是以8为底的幂次方。例如:

(162.4)8=1×82+6×81+2×80+4×8-1=(114.5)10

5.十六进制

十六进位计数制简称十六进制,有16个不同的数码符号:0,1,2,3,4,5,6,7, 8,9,A,B,C,D,E,F。其中,A,B,C,D,E,F分别表示十进制中的10,11, 12,13,14和15。在十六进制中,每个数码符号根据它在这个数中所处的位置(数位),按“逢十六进一”来决定其实际数值,即各数位的位权是以16为底的幂次方。例如:

(2BC.48)16=2×162+B×161+C×160+4×16-1+8×16-2=(700.28125)10

总结以上4种进位计数制,可以将它们的特点概括为:每一种计数制都有一个固定的基数,每一个数位可取基数中的不同数值;每一种计数制都有自己的位权,并且遵循“逢基数进一”的原则。

2.1.2 原码、反码和补码

在计算机内部,所有的信息都要用二进制数来表示,这个二进制数就称为机器数。不考虑正、负的机器数称为无符号数。考虑正、负的机器数称为有符号数。为了在计算机中正确地表示有符号数,通常规定最高位为符号位,并用0表示正,1表示负,余下各位表示数值。这种把符号数字化,并和数值位一起编码的办法,很好地解决了带符号数的表示方法及其计算问题。对于整数来说,常用的有原码、反码、补码3种。

1.原码

机器数本身就是原码表示法。例如:若位长为8,数值125的原码表示法为(01111101)2;因为125转化成二进制数为(1111101)2,占7位,最高位是符号位,正数用0表示,如图2.1所示(图中每一格表示1位)。

图2.1 125的原码表示法(8位)

类似地,数值-125的原码表示则应为(11111101)2,因为最高位是符号位,负数用1表示。

2.反码

正数的反码就是它的原码,负数的反码是将除符号位以外的各位取反得到的。例如:

[125]=[125]=01111101 [-125]=11111101 [-125]=10000010

3.补码

正数的补码就是它的原码,负数的补码是将它的反码在末位加1得到的。例如:

[125]=[125]=01111101

[-125]=11111101 [-125]=10000010 [-125]=10000011

需要说明的是,对于整数来说,在计算机内都是用补码来存储的。

2.1.3 非数值信息的编码

计算机除了用于数值计算之外,还要进行大量的文字信息处理,也就是要对各种文字信息的符号进行表达。这些非数值数据在计算机内中采用这样的方法表示:

(1)使用由若干位组成的二进制数来表示一个符号;

(2)一个二进制数只能与一个符号唯一对应,即符号集内所有的二进制数不能相同。

这样,二进制数的位数将取决于符号集的规模。例如:128个符号的符号集需要7位二进制数;256个符号的符号集则需要8位的二进制数,这就是字符编码。下面介绍几种常见的编码。

1.ASCII码

ASCII(American Standard Code for Information Interchange)码是美国标准信息交换代码的简称,用于给西文字符编码。这种编码由7位二进制数组合而成,可以表示128个字符,目前在国际上广泛流行。

ASCII码是7位二进制编码,而计算机的基本存储单位是字节(Byte),1字节包含8个二进制位(bit)。因此,ASCII码的机内码要在最高位补一个0。后来,IBM公司把ASCII码的位数增加1位,用8位二进制数构成一个字符编码,共有256个符号。扩展后的ASCII码除了原先的128个字符之外,又增加了一些常用的科学符号和表格线条。附录B中表B.1和表B.2分别列出了ASCII码字符集的基本字符和扩展字符。

2.汉字编码GB 2312—80

我国国家标准总局于1981年颁布了《中华人民共和国国家标准信息交换用汉字编码》(GB 2312—80)。该标准收录了汉字、图形、符号等共7445个,并根据汉字的常用程度确定了一级和二级汉字字符集。这么多的汉字都必须用不同的二进制数表示,1字节显然不够,所以采用了称为GB码的编码方式。字符集中的任何一个汉字或符号都用两个7位二进制数表示,在计算机中占2字节,并将每个字节的最高位常常置为1。

3.ISO/IEC 10646,Unicode编码

ISO/IEC 10646即通用多8位编码字符集(Universal Multiple-Octet Coded Character Set, UCS)的国际标准,用于世界上各种语言、符号的数字形式的表示、传输、交换、处理、存储输入及展现。它与Unicode组织的Unicode编码(统一的字符编码标准,采用双字节对字符进行编码)完全兼容。

显然,计算机对于ASCII、汉字等非数值数据,是用其二进制编码来存储的。