数据类型
分类
简单类型
- 有序类型
- 枚举
- 子界
- 整数
- 字符型
- 布尔型
- 非有序类型
- 实数类型
结构类型
- 集合型
- 数组型
- 记录型
- 文件型
- 类类型
- 类应用型
- 接口型
- 其他类型
- 字符串类型
- 指针类型
- 过程类型
- 变体类型
对有序类型处理的函数
函数 | 作用 |
---|---|
Ord | 返回有序表达式的序号 |
pred | 返回有序表达式的直接前趋值 |
Succ | 返回有序表达式的直接后继值 |
High | 返回有序表达式的最大值 |
Low | 返回有序表达式的最小值 |
Inc | 有序变量递增 |
Dec | 有序变量递减 |
Sizeof | 返回各种数据类型的内存分配字节数 |
类型转换
整型
类型 | 占字节数 | 数值范围 |
---|---|---|
ShortInt | 1字节 | -128~127 |
SmallInt | 2字节 | -32768~32767 |
langInt | 4字节 | -2147483648~2147483647 |
Integer | 4字节 | -2147483648~2147483647 |
Int64 | 8字节 | -263 ~ 263-1 |
Byte | 1字节 | 0-256 |
Word | 2字节 | 0~65535 |
LangWord | 4字节 | 0~4294967259 |
Cardina | 4字节 | 0~4294967259 |
实数类型
类型 | 占字节数 | 数值范围 | 有效位数 |
---|---|---|---|
Real48 | 6字节 | 2.9x10(-39) ~ 1.7x10(38) | 11,12 |
Single | 4字节 | 1.5x10(-45) ~ 3.4x10(38) | 7,8 |
Duoble | 8字节 | 5x10(-324) ~ 1.7x10(308) | 15,16 |
Extended | 10字节 | 3.6x10(-324) ~ 1.7x10(4932) | 19,20 |
comp | 8字节 | -(2(64)+1) ~ 263-1 | 19,20 |
Real | 8字节 | -5.0 x10(-324) ~ 1.7 x 10(308) | 15,16 |
Real48老掉牙了别用了
Double和Real 等价的 其他扩展只是位数比较精确的了
还有个 currency个类型 这里是 货币类型 这里没有写
字符
类型 | 占字节数 | 存储内容 |
---|---|---|
Ansichar | 1字节 | 存储一个Ansi字符,基本类型 |
WideChar | 2字节 | 存储一个Unicode字符,基本类型 |
Char | 1字节 | 存储一个Ansi字符,通用类型 |
- Ansiz字符是扩展的是ASCII字符 每个字符占一个字节
- Unicode字符前256 个字符就是Ansi字符集
- chr 可以把一个byte类型转换成一个字符类型见上一个表
bool 型
类型 | 占字节数 | 存储内容 |
---|---|---|
Boolean | 1字节 | false & true |
byteBool | 2字节 | false & true |
WordBool | 1字节 | false & true |
LongBool | 4字节 | 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~2GB | 2^31 | 保存NULL结尾的ASCII的字符串 |
WideString(宽) | 4b~2GB | 2^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:标识符;
类型文件 后面的类型不可以是动态的类型;
当然也可以合并起来写 我就不赘述了;