数据类型

分类

简单类型

  • 有序类型
  1. 枚举
  2. 子界
  3. 整数
  4. 字符型
  5. 布尔型
  • 非有序类型
  1. 实数类型

结构类型

  1. 集合型
  2. 数组型
  3. 记录型
  4. 文件型
  5. 类类型
  6. 类应用型
  7. 接口型
  • 其他类型
  1. 字符串类型
  2. 指针类型
  3. 过程类型
  4. 变体类型

对有序类型处理的函数

函数作用
Ord返回有序表达式的序号
pred返回有序表达式的直接前趋值
Succ返回有序表达式的直接后继值
High返回有序表达式的最大值
Low返回有序表达式的最小值
Inc有序变量递增
Dec有序变量递减
Sizeof返回各种数据类型的内存分配字节数

类型转换

image.png

整型

类型占字节数数值范围
ShortInt1字节-128~127
SmallInt2字节-32768~32767
langInt4字节-2147483648~2147483647
Integer4字节-2147483648~2147483647
Int648字节-263 ~ 263-1
Byte1字节0-256
Word2字节0~65535
LangWord4字节0~4294967259
Cardina4字节0~4294967259

实数类型

类型占字节数数值范围有效位数
Real486字节2.9x10(-39) ~ 1.7x10(38)11,12
Single4字节1.5x10(-45) ~ 3.4x10(38)7,8
Duoble8字节5x10(-324) ~ 1.7x10(308)15,16
Extended10字节3.6x10(-324) ~ 1.7x10(4932)19,20
comp8字节-(2(64)+1) ~ 263-119,20
Real8字节-5.0 x10(-324) ~ 1.7 x 10(308)15,16

Real48老掉牙了别用了
Double和Real 等价的 其他扩展只是位数比较精确的了
还有个 currency个类型 这里是 货币类型 这里没有写

字符

类型占字节数存储内容
Ansichar1字节存储一个Ansi字符,基本类型
WideChar2字节存储一个Unicode字符,基本类型
Char1字节存储一个Ansi字符,通用类型
  • Ansiz字符是扩展的是ASCII字符 每个字符占一个字节
  • Unicode字符前256 个字符就是Ansi字符集
  • chr 可以把一个byte类型转换成一个字符类型见上一个表

bool 型

类型占字节数存储内容
Boolean1字节false & true
byteBool2字节false & true
WordBool1字节false & true
LongBool4字节false & true

这个四个类型不仅仅是 存储空间上的区别 每个存储方案都不同

boolean 用 1 表示true 0表示false
其他三个类型 都是用 0表示false 非零表示 true

枚举类型

枚举类型这类的复杂类型在使用前需要分两步走,声明类型,定义具体的变量

声明一个枚举类型:
Type 类型名称=(符号1,符号2,.......);

定义具体的变量:
var 变量名:类型名称;

 type
  days=(sun,mon,tue,wed,thu,fri,sat);
  colors=(red,yellow,blue,white,black,green);
var
 a:days;
 b=colors;

个人感觉上面的方法是在麻烦 来个爽快的,我们可以一起定义了

var
  holiday,workday:(sun,mon,tue,wed,thu,fri,sat);
  color:(red,yellow,blue,white,black,green);

1.枚举类型是有序类型
2.枚举的数量无法超过255个
3.名字不可以重复,并且 同一个枚举项无法用在多个枚举类型中
4.不能直接用枚举类型中的元素进行运算操作

子界类型

声明一个子界类型
type
类型名称=常量下界..常量上界;
声明具体变量:
var
变量名:类型名称;

type  letter='a'..' d ';
var ch1,ch2:letter;

//和枚举一样 我们也可以一起定义了
var ch3,ch4:'g'..'z';

子界类型是C语言没有的类型,我在这里重点介绍一下

  • 如果我们定义一个变量为integer型,那么它的取值范围一般为-32768~32767。而事实上,每个程序中所用的变量的值都有一个确定的范围。 人的年龄一般为1到120岁,一年中的月数为1到12月,一月中的天数为1到31天等等。

  • 如果能在程序中对所用的变量的值域作具体规定,就便于检查出那些不合法的数据,防止越界,这就能更好地保证程序运行的正确性且在一定程度上节省内存空间。

  • 子界类型的变量继承了他的常量运算符的一切运算特性,但是必须保持在定义范围内

  • 个人理解成 按照自己的需求 定义的一个带自定义范围的数据类型

注意事项:
下界和上界必须是同一顺序类型(该类型称为子界类型的基类型),且上界的序号必须大于下界的序号。

字符串类型

类型占用内存最大长度存储内容
ShortString(短)256字节255保持ASCII字符串
AnsiString(长)4b~2GB2^31保存NULL结尾的ASCII的字符串
WideString(宽)4b~2GB2^30保持以NULL结尾的Unicode字符串
  • 保留字string在默认的{$H+}编译器模式表示AnsiString,在{$H-} 下时,保存的是ShortString。
  • 无论在哪那种编译器下string[长度(0-255)]都表示shortString,如过赋值的字符串长度超出定义的长度那么超出的部分就要被截取。
  • 下面的两种字符串,没有赋值的时候,占用大小为4字节,定义之后大小有赋值的值决定
  • 下面的两种字符串,前32位(4字节)来存储引用基数,在后面32位来存储字符串长度,最后在存储保存具体的值,最近以null结尾。存储所占的最大大小由内存大小决定。

集合类型

集合用一种有效的手段来表示一组有序数、字符和枚举值。在Delphi中,一个集合是由具由同一有序类型的一组数据元素所组成,这一有序类型称为该集合的基类型。

集合类型的声明:

type 集合标识符=set of 基类型;
集合类型的变量的声明
var 集合变量标识符:集合标识符;

当然也可以合二为一
var 集合变量标识符:set of 基类型;

基类型可以是 任意有序类型 枚举哇 子界都可以,但是一定是有序的;
集合类型也可以运算,等下一篇文章在写这个吧;

数组类型

这里的数组定义的方法,使用方法和C语言的大有不同
数组类型定义了一组指定类型的元素序列,在方括号中填入下标值就可访问数组中的元素。

声明一维数组类型
//静态的
type 数组标识符=array[下标类型] of 基类型;
//动态的数组
type 数组标识符=array of 基类型; //使用之前需要用SetLenth定义长度

声明二维数组类型
//静态的
type 数组标识符=array[下标类型,下标类型] of 基类型;
//或者
type 数组表示符=array[下标类型] of array[下标类型];
//动态的数组
type 数组标识符=array of array of 基类型; //使用之前需要用SetLenth定义长度
当然这个也可以合并写 ,我就不赘述了。

下标类型 可以是整数,字符,布尔,枚举等,可以是任意的

type
  DayTemperatures = array [1..24] of Integer;

var
  DayTemp1: DayTemperatures;

procedure AssignTemp;
begin
  DayTemp1 [1] := 54;
  DayTemp1 [2] := 52;
  ...
  DayTemp1 [24] := 66;
  // compile-time error
  DayTemp1 [25] := 67;
  //这里是错的,因为每个元素都必须是Integer类型
  DayTemp1 [3] := 1.0;
end;

Setlenth(数组变量标识符,长度1,长度2 ......);

记录类型

记录类型是由不同类型组成的结构,每个元素被称为一个字段,每个字段标识符都可以用来区别别的标识符,每个字段可以存储不用带标识符。类似于c语言的结构体,访问字段可以用‘.’操作符;

声明记录类型的格式

type 记录类型标识符= record;
域名表1:类型;
域名表2:类型;
域名表3:类型;
......
域名表n:类型;
end;

type 
 Student =record
 num:integer;
 name:string;
end;

Procedure Ss;
begin
var S1:Student;
s1.name:='越行勤';
s1.num:=2019;
end;

文件类型

分为三种:文本文件textfile,类型文件(file of 类型),无类型文件file;

声明:

type 标识符=textfile;
标识符= file of 类型;
标识符= 无类型文件;
var F1:标识符;

类型文件 后面的类型不可以是动态的类型;
当然也可以合并起来写 我就不赘述了;

本篇文章就说到这里了,下一篇我介绍一下粗浅地介绍一下指针类型和过程类型,变体类型;

点我访问

努力成长的程序员