1第四章数据类型(补充)程序设计语言原理东南大学计算机科学与工程系2数据类型的设计、实现与语义1)数据类型概念的早期发展简史2)数据类型3)强类型(strongtyping)4)Ada的数据类型分类体系5)Ada语言的枚举类型6)Ada的数值类型7)Ada的带符号整数类型3数据类型的设计、实现与语义8)Ada的实数类型9)Ada的浮点数类型10)Ada的定点类型11)Ada的数值类型总结12)Ada的数组类型13)指针类型14)Ada的记录类型44.1数据类型概念的早期发展简史简单说来,数据类型就是数据对象的分类及该分类上的操作。54.1.1基本指令系统中的类型因素指令系统:数据传送指令INAL,PORT(字节)INAX,PORT(字)算术运算MUL无符号数乘法指令IMUL有符号数乘法指令64.1.1基本指令系统中的类型因素符号扩展指令CBW(convertbytetoword)CWD(convertwordtodoubleword)逻辑运算ANDORNOTXOR74.1.1基本指令系统中的类型因素字符串处理MOVS(movestring)CMPS(comparestring)控制转移JMPSHORTOPRJMPWORDPTROPR84.1.1基本指令系统中的类型因素数据类型:字节、字、双字、无符号整数、有符号整数、布尔值(值或向量)、字符、字符串评注:抽象程度低,以原子类型为主,分类不严格(缺乏原则、主要基于硬件功能和应用需要)、转换自由(基本在使用者的主观中,缺乏明显的转换标志)94.1.2汇编语言中的类型数据定义伪指令DB、DW、DDDATA_BYTEDB10,4,10HDATA_WORDDW100,100H,-5DATA_DWDD3*20,0FFFDHMESSAGEDB‘HELLO’ARRAYDB100DUP(?)104.1.2汇编语言中的类型结构定义伪指令(C语言)personstrucfnamedb'Firstname'lnamedb'lastname'monthdw?daydw?yeardw?personends114.1.2汇编语言中的类型属性(类型)修改操作符TYPEvariable返回类型LENGTHvariable返回分配给该变量的单元数SIZEvariable返回分配给该变量的字节数,SIZE=LENGTH*TYPEOFFSETvariable返回变量的偏移地址SEGvariable返回变量的段地址值124.1.2汇编语言中的类型类型指定操作符MOVAX,WORDPTROPER1+1134.1.2汇编语言中的类型评注:复合(聚集)类型能力有所提高,但其中的数组类型没有明确化;开始支持用户定义类型;地址概念是类型的核心概念,占有等量存储空间的类型就兼容;类型转换显式化,但缺乏语义上的约束;出现属性的雏形。144.1.3FORTRAN语言静态、不支持用户定义类型对数值类型支持也十分有限:整数、实数、双精度、复数154.1.4C语言枚举类型、用户定义类型(数组、结构),支持动态数据结构(动态数组、联合),不具备支持抽象数据类型的能力;灵活,但理论基础不足,有些方面带有明显的汇编语言的痕迹(数组名同时表示数组第一个元素的地址,结构标志符本身不作为类型区分符使用);标准对类型之间的关系没有详细说明(boolean,numeration),转换比较随意(尤其在指针的问题上,图1);164.1.5Ada类型丰富、全面,支持用户定义类型、抽象数据类型和面向对象概念,具备坚实的理论基础,概念一致、完整,同时提供以上语言中所具有的灵活性Ada的类型定义机制174.1.5.1Ada的类型定义机制用户定义类型:subtype用户定义类型:newtype;exampleofsubtype:subtypeDay_Numberisintegerrange1..31;subtypeFeb_DayisDay_Numberrange1..28;184.1.5.1Ada的类型定义机制(续)subtype类似与pascal的子界类型,仅对相应type的值域加以限制,其它方面没有改变,subtype和相应type及同体系中其它subtypes之间进行混合运算时无需显式转换,即从本质上讲,subtype没有创造新的类型。Exampleofnewtypetypecolouris(Red,Amber,Green);typeLightisnewcolour;19typeApplesisnewInteger;typeOrangesisnewInteger;No_Of_Apples:Apples;No_Of_Oranges:Oranges;No_Of_Apples:=No_Of_Oranges;--wrongNo_Of_Apples:=Apples(No_Of_Oranges);--OKInteger(No_Of_Apples)+Integer(No_Of_Oranges);--OK4.1.5.1Ada的类型定义机制(续)20NewTypeVs.ParentTypeNewtype的作用Newtype继承parenttype的预定义操作,用户定义的操作(primitivetype)(用户定义的判等操作除外)214.2数据类型简单来讲,数据类型就是对数据对象的分类,分类方式主要是内涵式(少数是外延式)。内涵是对数据对象内在性质(静态、动态)的描述。externaldomain:问题域中的数据类型区分体系;internaldomain:编译器所能识别的存在于程序中的数据类型分类体系,我们希望该体系能够和externaldomain建立一一对应的关系,同时编译器也能识别这样的关系,参见图2、图3。224.2.1数据类型概念的组成(名字,结构,值集,属性集,操作集)逻辑结构与存储表示逻辑操作与其实现用户定义实现,系统实现234.3强类型(strongtyping)强类型概念发展:1)ST#1(typed):必须为数据对象声明类型。2)ST#2(typed):每个变量都必须与一类型相联系,而且,该变量只能存储这一类型的对象。3)ST#3(stronglytyped):4)ST#4(stronglytyped)244.3.1强类型—ST#31)所有的数据对象(变量,值,形参)均属于特定的类型(一般是有名的)。这些类型可以是预定义的或用户定义的。每个数据对象仅属于一种类型。2)每个变量仅能存储唯一类型的对象。3)一个类型可以有多个变体,该类型的数据对象的变体内容可在运行时确定,程序在处理此类数据对象时,必须对变体部分予以确认。4)在子程序调用过程中,所有实参的类型必须与对应形参的类型相匹配。语言必须对匹配原则做出明确规定。25unionu_tag{intival;floatfval;char*sval;}u;联合26struct{char*name;intflags;intutype;union{intival;floatfval;char*sval;}u;}symtab[NSYM];带联合的结构274.3.2强类型—ST#41)满足ST#32)该语言须有系统、完整的类型体系,对类型间的关系及各种语境下使用类型概念的规则做出合理的规定。3)该类型体系及相关规则能够良好地反映问题域的逻辑结构和相关的约束。4)尽量在静态情况下完整地确定程序中的类型信息,检查出违反类型体系及相关规则的情况,给出明确的信息;对在动态情况下可能出现的类型错误给予充分的考虑,并予分类,提供预定义错误类型,提供动态检查及异常处理设施。28强类型是一个相对的概念。有一种说法,认为必须在静态条件下检测出所有的类型错误才算是强类型的。这是一个历史上的看法。现在看来,这样的定义有失简单与片面。现在的通用语言几乎都提供一些动态的数据类型。294.4Ada的数据类型分类体系elementaryalltypescompositeaccessscalararrayrecord(protectedtask)discreteenumerationintegersignedmodularfloatingfixeddecimalordinaryreal304.5Ada语言的枚举类型4.5.1枚举类型举例4.5.2属性与操作4.5.3布尔类型314.5.1枚举类型举例typeDayis(Mon,Tue,Wed,Thu,Fri,Sat,Sun);typeColoris(White,Red,Yellow,Green,Blue,Brown,Black);typeHexais('A','B','C','D','E','F');324.5.2属性与操作1基于标量类型属性的操作2第一个枚举字面值的位置为0,其后为“1”,…T’Val(T’Pos(X))=XT’Succ(X)=T’Val(T’Pos(X)+1)3关系操作334.5.3布尔类型定义:typeBooleanis(False,True);typeAnsweris(False,Don't_Know,True);预定义操作枚举类型的所有预定义操作,not,and,xor344.6Ada的数值类型涉及数值类型的主要问题:对机器实现的依赖(存储,界限,精度)354.7带符号整数类型4.7.1设计考虑4.7.2例子4.7.3预定义操作364.7.1设计考虑设计数据类型时的考虑:范围、精度(forrealtype),硬件提供的数据类型,效率,可移植性.374.7.2例子typePage_Numisrange1..2_000;subtypeSmall_IntisIntegerrange-10..10;subtypeBuffer_SizeisIntegerrange0..Max;384.8Ada的实数类型浮点类型和定点类型混合运算394.9浮点类型typeCoefficientisdigits10range-1.0..1.0;typeRealisdigits8;typeMassisdigits7range0.0..1.0E35;subtypeProbabilityisRealrange0.0..1.0;--asubtypewithasmallerrange404.10定点类型typeVoltisdelta0.125range0.0..255.0;typeFractionisdeltaSystem.Fine_Deltarange-1.0..1.0;Fraction'Last=1.0-System.Fine_DeltatypeMoneyisdelta0.01digits15;decimalfixedpoint414.11Ada的数值类型总结基本定义(范围、精度、表示方法),类型转换机制NumericTypeConversion如果整数之间的转换,只需转换类型标记(要检查约束)。实数之间的类型转换的原则是保证精度。实数向整数转换的过程主要是取整的过程。424.12数组类型数组元素:具有相同的类型数组索引:任意离散类型434.12.1例子大多数语言中,数组下标局限于整数类型,这种局限缺乏理论上的依据。Ada语言中,数组的下标可以是任意离散类型。我们通过一些例子来看看这种约束的解除带来的便利。44Hours_Worked:array(Day)ofFloat;ForDinWorkdayloopHours_Worked(D):=8.0;Endloop;Hours_Worked(Sat):=0.0;Hours_Worked(Sun):=0.0;45Work_Day:constantarray(Day)ofBoolean:=(True,True,True,True,True,False,False);Tomorrow:constantarray(Day):=(Tue,Wed,Thu,Fri,Sat,Sun,Mon);46匿名类型Examplesofobjectdeclarationswith