3.2 数据类型
数据对象通常被储存在连续相邻的内存单元里。基本的数据类型,比如字符型、整型、和长整型,可以被放在寄存器中来操作。聚集数据类型,比如数组、字符串和记录,则不能将其整体放在寄存器中,因为它们的大小通常超过寄存器的大小,所以通过一个指向它们起始地址的指针来存取它们更容易。
返回值 |
参数 |
控制链 |
存取链 |
栈标记 |
局部变量 |
图 3-4: 栈框架
关于 i80286 体系结构的不同数据类型的大小见图 3-5 所示。它的机器字长是 16 位。大小以 8 位字节为单位。
数据类型 | 大小(字节) |
字符型 | 1 |
整型 | 2 |
长整型 | 4 |
实型 | 4 |
长实型 | 8 |
近指针 | 2 |
远指针 | 4 |
其它类型 | >=1 |
图 3-5: 在 i80286 中各种数据类型的大小
3.2.1 高级语言的数据管理
对于聚集数据类型,不同的编译器有不同的管理方式。这一节依据参考文献[Mic87],描述 C、Pascal、Fortran 和 Basic 语言编译器所使用的不同格式。
数组
数组是连续相邻的一片内存,它保存一个或多个特定类型的数据项。根据特定语言所规定的顺序,数组在内存里用一些行或列来实现:
l 行为主顺序:多维数组的元素按行顺序存储;即,一行接一行。C 语言和 Pascal 语言编译器使用这种顺序。
l 列为主顺序:多维数组的元素以列顺序存储,而不是按照行顺序。Fortran 语言和 Basic 语言编译器使用这种顺序。有些 Basic 语言编译器有一个使用以行为主顺序的编译选项。
对于大多数语言,数组的大小在编译时是已知的;比如 C、Pascal 和 Fortran 就是这样的。Basic 允许运行时声明数据大小,因此一个数组需要有一个数组描述符,用来保存数组的大小和一个指针指向数组储存在内存里的实际位置。
字符串
字符串是一个字符序列。不同语言使用不同的表示法表现一个字符串,如下:
l C 语言格式:一个字符串是一个以空字符(null, 即 0) 结束的字节数组。
l Fortran 语言格式:一个字符串是在一个固定不变的存储单元上的字节序列,因此在字符串结束处不需要定界符。
l Pascal 语言格式:一般的 Pascal 编译器有两种类型的字符串:STRING 和 LSTRING。前者是一个固定长度字符串,与 Fortran 格式一样。后者是一个长度可变的字符串,是一个字符数组,该数组的第一个字节保存该字符串的长度。标准的 Pascal 语言没有 STRING 或 LSTRING 类型。
l Basic 语言格式:一个字符串用一个 4 字节的字符串描述符实现;开头两个字节保存字符串的长度,后两个字节是一个默认数据区的相对偏移量,在那里保存字符串。这个区域由 Basic 的字符串空间管理例程分配,因而其位置在内存里是不固定的。
记录
记录是连续相邻的一片内存,它保存一个或多个数据类型的相关数据项。在不同的语言里记录有不同的名称:在 C 语言里叫 struct,在 Pascal 语言里叫 record,在 Basic 语言里叫用户定义类型。默认地,C 语言和 Pascal 语言储存结构体的方式除了字节单位尺寸的对象以及这些对象的数组,而且是无压缩存储、字对齐(word-aligned)。Basic 语言和某些 C 语言以及 Pascal 语言的编译器储存结构体的方式是压缩存储。
复数
Fortran 复数数据类型按照以下方式存储浮点数:
l COMPLEX*8:4 个字节表现实数部分,其它 4 个字节表现虚数部分的浮点数。
l COMPLEX*16:8 个字节表现实数部分,其它 8 个字节表现虚数部分。
布尔值
Fortran 的 LOGICAL 数据类型按照以下方式存储布尔信息:
l LOGICAL*2:一个字节保存布尔值(0 或 1),另一个字节保留未使用。
l LOGICAL*4:一个字节保存布尔值,其它三个字节保留未使用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论