第三章数据类型和数据表示程序处理的对象是数据,数据有各种各样的表示形式。计算机中只支持和实现有限的数据类型集,确定数据类型与表示是软、硬件界面的组成部分。3.1数据类型数据类型是指面向应用和面向软件系统所处理的各类数据,其特征是:一组值的集合与在此集合上的操作集。例如:整数整数值集合与算术操作集合;布尔数据布尔值(真、伪)与布尔操作集合(与、或、非、异或等)。定义数据类型有助于防止不同数据类型进行操作所引起的错误。数据类型分:基本数据、结构数据、访问指针和抽象数据等。3.1.1基本数据类型这是指=进制位及其位串组成的数据。其中,=进制位是数量的固有数据类型,相应的操作是逻辑操作与算术操作。若干=进制位组成的位串,取值为00···00~11···11(L),是如下的基本数据类形:整数及自然数浮点数(实数)字符布尔数十进制数其相应的操作集为逻辑、算术运算及移位等。3.1.2结构数据类型由相互有关的数据元素复合而成的数据类型称结构数据类型,其中数据元素可以基本数据类型中的元素,也可以是结构数据类型中的元素。属结构数据类型有:向量和数组、字符串、堆栈、队列、记录等。在结构数据类型的数据元素有的是相同类型,如向量、数组:有的则可能不同,如记录,各字段数据项有不同的类型。结构数据类型由用户定义或系统使用。结构数据类型比较复杂,一般计算机系统只部分地支持这种数据类型。3.2数据表示3.2.1数据表示、数据类型和数据结构的关系数据表示指可由硬件直接辨认的数据类型,硬件直接辨认则指有对相应数据类型进行操作的指令和操作的部件。例如:定点数定点运算指令和整数运算部件;布尔数逻辑运算指令和逻辑运算部件;实数(浮点)浮点运算指令和浮点运算部件。数据结构指结构数据类型的组织方式,它反映了各种数据元素或信息单元间的关系,如串、堆栈、向量、数组表、树、图、队列、矩阵等。这些数据结构硬件大多无法直接识别,必须经过映射变换为可存储于一维存储器的各种数据表示后方能识别。数据表示可为各种数据结构的实现提供不同程度的支持,采用什么样的数据表示将反映数据结构实现的效率和使用的方便程度。因为数据表示需要硬件支持,所以数据表示是软硬件界面的组成部份。数据结构研究的一个主要课题,是如何使用最少的存储空间来存储数据结构,以及采用什么算法能最快、最简单地存储和访问它们。3.2.2二进制的定点、浮点数据表示因为几乎所有计算机都支持二进制数据表示,这里就不再讨论。但二进制浮点数的表示有较大的差别,为了有利于软件的移植,美国IEEE提出了IEEE754标准,这是从体系结构支持浮点数的表示方法。IEEE754标准的浮点数表示形式为:符号(S)阶码(E称移码)尾数(M原码)尾数小数点左边一位是隐含的。具体分4种浮点数格式:(1)单精度格式(32位):E=8位,M=23位。(2)扩展单精度格式(≥43位):E≥11位,M≥31位。(3)双精度格式(64位):E=11位,M=52位。(4)扩展双精度格式(≥79位):E≥15位,M≥63位。下图是单精度浮点数格式:1823符号阶码尾数其中,移码值为127,阶码范围1~254,实际的阶码值为–126~127。尾数有效位实际为24位,有效值为1.M。IEEE754标准单精度浮点数N解释如下:E=255M≠0N=NaN非数E=255M=0N=(-1)S无穷大1≤E≤254N=).1(2)1(127MES规格化数E=0M≠0N=).0(2)(126MS非规格化数SEME=0M=0N=0数零相应地也可以对其余三种浮点数N作出解释。下表给出了IEEE754单、双精度浮点数的特征。单精度双精度符号位11指数位811尾数位2352总位数3264指数系统移码127移码1023指数取值范围-126~+127-1022~+1023最小规格化数126210222最大规格化数128210242+进制数范围3810~381030810~30810最小非规格化数451032410IEEE754标准使非数值、正负∞、规格化数与非规格化数以及0(精确表示)加以集中表示。这样对a/0(a≠0)产生正负无穷大,0/0产生非数值NaN都能表示与处理,给软件的应用开发和移植带来方使。下面举两个IEEE754标准浮点数表示的例子:(1)N=-1.5,写出单精度浮点数表示。解:N=-1.5=5.12)1(01所以S=1E=127M=0.5单精度浮点数格式表示为:10111111110000000000000000000000=BFC00000H(2)求以下单精度浮点数N的值为多少?11000000101000000000000000000000解:S=1E=129M=0.01B=0.25所以N=525.12)25.1(2)1(212712913.2.3向量数据表示向量是一组数据元素的有序集合,如),(21nAAAA,其中各元素有相同的数据结构和类型,在存储器中等间距存储。向量数据表示有三个确定参数:基址,位移量,长度。向量运算操作时有:起始地址=基址+位移量有效长度=向量长度-位移量向量指令对向量数据进行操作,由操作码和相关的向量参数组成。如A,B两个向量相加得到C向量;C=A+B。向量加指令为:向量加xaybzc其中,x、y、z是寄存器,分别寄存源向量A,B和结果向量C的位移量,而a、b、c则分别为A,B,C三个向量的基址和长度。现设x,y,z内容分别为:4,-4,4,a,b,c(长度)分别为:12,4,12,基址0。则向量加指令实现如下操作:C(4:11)=A(4:11)+B(-4:3)如果是标量机,上述向量加操作需用一段循环程序完成,以下是用FORTRAN语言写的程序。DO20I=4,1120C(I)=A(I)+B(I-8)上述向量加操作可用下图表示:基址起始地址位移有效长度A0A1A2A3A4A5A6A7A8A9A10A11基址起始地址基址位移有效长度位移有效长度基址起始地址含有大量零元素的向量称稀疏向量,为了节省存储空间和处理时间,稀疏向量采用压缩向量表示。如下图:Z向量(有序位向量)稀疏向B-4B-3B-2B-1B0B1B2B3C0C1C2C3C4C5C6C7C8C9C10C11A000A3A400A7A0A3A4A7100111001量压缩向量3.2.4自定义数据表示机器语言通常由指令指明操作数据类型,对同一种运算,不同的数据类型要设置不同的指令。这和高级语言操作数由数据类型语句显式说明,不同数据类型对同一种运算只采用一个操作符有很大的差别。为减少这个差别,提出了自定义数据表示,即由数据本身来指明类型。有两种自定义数据表示形式。1.带标志符数据表示(Taggeddatarepresentation)这种表示对每一个数据附加一个标志符,说明后面的数据所具有的类型,如整数、浮点数、十进制数、字符等。格式如下:带标志符数据表示的优点是简化指令系统,筒化编译,能自动地进行数据变换,易于对编程进行查错,方便程序的调试等。但也有可质疑的,主要是数据区域增大,指令执行速度变慢,增加空间和时间的额外开销。带标志符数据表示目前只在支持动态数据类型的高级语言中应用,如LISP,PROLOG等。2.数据描述符(Datadescriptors)一些复杂和多维结构的数据类型,一个数据中的各数据元素的结构和类型相同,因此可采用描述符集中统一描述,描述符和数据可分开存储。描述符格式如下:描述符标志特征标记数据块长度数据块起始地址对采用描述符数据操作时,指令由操作码和描述符地址组成,通过描述符来访问数据元素。如下面的例子。描述符数据块数据块标志符数据操作码XY010010地址生成逻辑010000000描述符通过多次使用描述符访问可方便地描述多维数据结构,例如要构成一个3×2的=维数组,可描述如下:s23×2=维数组As1s33×2=维数组As4a11a12a21a22a31a323.2.5堆栈数据表示堆栈结构也是一种数据表示。引入一种数据表示,是以它能否提高系统的效率为依据。总的说,随着计算机硬件技术的发展,数据表示的范围在逐渐扩大是必然的趋势。0100103s10102s20102s30102s4000a11000a12000a21000a21000a31000a32