Oracle® Developer Studio 12.5:Fortran 用户指南

退出打印视图

更新时间: 2016 年 6 月
 
 

4.2 数据类型

本节介绍 Fortran 数据类型的功能和扩展。

4.2.1 布尔类型

f95 支持布尔类型的常量和表达式。 但是,没有布尔变量或数组,也没有布尔类型语句。

4.2.1.1 控制布尔类型的各种规则

  • 对于屏蔽操作,按位逻辑表达式具有布尔结果;它的每个位都是对相应操作数位进行一个或多个逻辑运算的结果。

  • 用于二进制算术运算符和关系运算符:

    • 如果一个操作数是布尔型,则在执行运算时不进行转换。

    • 如果两个操作数均是布尔型,则在执行运算时就当它们是整数一样。

  • 用户指定的函数均不能生成布尔结果,但某些(非标准的)内部函数可以。

  • 布尔和逻辑类型具有以下差异:

    • 变量、数组和函数可以是逻辑类型,但它们不能是布尔类型。

    • 可以使用 LOGICAL 语句,但不能使用 BOOLEAN 语句。

    • 逻辑变量、常量或表达式仅可以表示两个值:.TRUE..FALSE.。布尔型变量、常量或表达式可以表示任何二进制值。

    • 逻辑型实体在算术表达式、关系表达式或按位逻辑表达式中无效。布尔型实体在所有 3 种表达式中都有效。

4.2.1.2 布尔常量的替代格式

f95 允许使用以下替代格式(没有二进制)的布尔常量(八进制、十六进制或霍尔瑞斯)。 不能将变量声明为布尔型。标准 Fortran 不允许使用这些格式。

八进制

ddddddB,其中 d 是任意八进制数字

  • 可以使用字母 Bb

  • 可以是 1 至 11 个八进制数字(0 至 7)。

  • 11 个八进制数字表示完整的 32 位字,最左侧的数字可以是 0、1、2 或 3。

  • 每个八进制数字指定 3 位的值。

  • 最后一个(最右侧的)数字指定最右侧 3 位(位 29、30 和 31)的内容。

  • 如果位数不足 11 个,则该值右对齐,即它表示字最右侧的位:位 n 至 31。其他位为 0。

  • 忽略空格。

在 I/O 格式规范中,字母 B 表示二进制数字;而在其他地方则表示八进制数字。

十六进制

X’dddX"ddd",其中 d 是任意十六进制数字

  • 可以包含 1 至 8 个十六进制数字(0 至 9,A-F)。

  • 任何字母既可以是大写也可以是小写 (X, x, A-F, a-f)。

  • 数字必须用撇号或引号括起来。

  • 忽略空格。

  • 十六进制数字可以以 + 或 - 符号开头。

  • 8 个十六进制数字表示一个完整的 32 位字,等效的二进制数字对应于 32 位字中每个位的内容。

  • 如果位数不足 8 个,则该值右对齐,即它表示字最右侧的位:位 n 至 31。其他位为 0。

霍尔瑞斯

接受的霍尔瑞斯数据格式为:

nH
’H
""H
nL
’L
""L
nR
’R
""R

上面的 "…" 是字符串,n 是字符数。

  • 霍尔瑞斯常量是布尔类型。

  • 如果任何字符常量是按位逻辑表达式,则该表达式的计算结果为霍尔瑞斯型。

  • 霍尔瑞斯常量可以包含 1 至 4 个字符。

示例: 八进制和十六进制常量。

布尔常量
32 位字的内部八进制数
0B
00000000000
77740B
00000077740
X"ABE"
00000005276
X"-340"
37777776300
X’1 2 3’
00000000443
X’FFFFFFFFFFFFFFFF’
37777777777

示例: 赋值语句中的八进制和十六进制数。

i = 1357B
j = X"28FF"
k = X’-5A’

在算术表达式中使用八进制或十六进制常量可产生未定义的结果,并且不会生成语法错误。

4.2.1.3 布尔常量的替代上下文

f95 允许在非 DATA 语句中使用 BOZ 常量。

Bbbb
Oooo
Zzzz
B"bbb"
O"ooo"
Z"zzz"

如果将它们赋值给实数变量,则不进行类型转换。

标准 Fortran 只允许在 DATA 语句中使用它们。

4.2.2 数值数据类型的缩写大小表示法

f95 允许在声明语句、函数语句和 IMPLICIT 语句中使用以下非标准的类型声明格式。 第一列中的格式虽然已被广泛使用,但它们是非标准的 Fortran 格式。第二列中的种类数字可能会因供应商不同而异。

表 28  数值数据类型的大小表示法
非标准
声明符
简短格式
含义
INTEGER*1
INTEGER(KIND=1)
INTEGER(1)
有符号的单字节整数
INTEGER*2
INTEGER(KIND=2)
INTEGER(2)
有符号的双字节整数
INTEGER*4
INTEGER(KIND=4)
INTEGER(4)
有符号的 4 字节整数
LOGICAL*1
LOGICAL(KIND=1)
LOGICAL(1)
单字节逻辑值
LOGICAL*2
LOGICAL(KIND=2)
LOGICAL(2)
双字节逻辑值
LOGICAL*4
LOGICAL(KIND=4)
LOGICAL(4)
四字节逻辑值
REAL*4
REAL(KIND=4)
REAL(4)
IEEE 单精度 4 字节浮点值
REAL*8
REAL(KIND=8)
REAL(8)
IEEE 双精度 8 字节浮点值
REAL*16
REAL(KIND=16)
REAL(16)
IEEE 四精度 16 字节浮点值
COMPLEX*8
COMPLEX(KIND=4)
COMPLEX(4)
单精度复数(每个部分 4 个字节)
COMPLEX*16
COMPLEX(KIND=8)
COMPLEX(8)
双精度复数(每个部分 8 个字节)
COMPLEX*32
COMPLEX(KIND=16)
COMPLEX(16)
四精度复数(每个部分 16 个字节)

4.2.3 数据类型的大小和对齐

存储和对齐始终以字节为单位。 可以划分为单字节的值按字节对齐。

类型的大小和对齐取决于各种编译器选项和平台以及变量的声明方式。COMMON 块中的缺省最大对齐位置是 4 字节边界。

使用特殊选项(如 -aligncommon-f-dalign-dbl_align_all- xmemalign- xtypemap)进行编译,可以更改缺省的数据对齐和存储分配。本手册中的缺省描述假定这些选项无效。

下表汇总了缺省的大小和对齐,并忽略类型和选项的其他方面。

表 29  缺省的数据大小和对齐(以字节为单位)
Fortran 数据类型
大小
缺省对齐
COMMON 中的对齐
BYTE X
CHARACTER X
CHARACTER*n X
1
1
n
1
1
1
1
1
1
COMPLEX X
COMPLEX*8 X
DOUBLE COMPLEX X
COMPLEX*16 X
COMPLEX*32 X
8
8
16
16
32
4
4
8
8
8/16
4
4
4
4
4
DOUBLE PRECISION X
REAL X
REAL*4 X
REAL*8 X
REAL*16 X
8
4
4
8
16
8
4
4
8
8/16
4
4
4
4
4
INTEGER X
INTEGER*2 X
INTEGER*4 X
INTEGER*8 X
4
2
4
8
4
2
4
8
4
2
4
4
LOGICAL X
LOGICAL*1 X
LOGICAL*2 X
LOGICAL*4 X
LOGICAL*8 X
4
1
2
4
8
4
1
2
4
8
4
1
2
4
4

请注意下列内容:

  • REAL*16COMPLEX*32:在 64 位环境(使用 -m64 进行编译)中,缺省对齐位置是 16 字节(而非 8 字节)边界,如表中 8/16 所示。该数据类型通常称为四精度

  • 数组和结构按照其元素或字段对齐。数组对齐方式与数组元素相同。结构对齐方式与具有最宽对齐的字段相同。

选项 -f-dalign 可强制将所有 8、16 或 32 字节数据与 8 字节边界对齐。选项 -dbl_align_all 可使所有数据与 8 字节边界对齐。如果程序依赖于这些选项的使用,则可能无法进行移植。