首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

定位您的应用程序 - 小端和大端 IBM XL Fortran 编译器的差异对您意味着什么(4)

定位您的应用程序 - 小端和大端 IBM XL Fortran 编译器的差异对您意味着什么(4)

16 字节的实数和复数类型XL Fortran 的扩展精度浮点型 REAL(16) 不是电气和电子工程师协会(IEEE)标准所建议的 binary128 格式。实际上,REAL(16) 包含两个 REAL(8) 部分,它们有不同的数量级,不会互相重叠(当数字是零或接近于零时除外)。即使在小端上,高阶 REAL(8) 值(即首先进入存储的)也必须有较大的数量级。REAL(16) 数字的值是它的两个 REAL(8) 部分的总和。
复数类型是由一个实数部分和一个虚数部分组成,其中实数部分始终在虚数部分之前。
请考虑以下代码片段:
1
2
3
4
5
real(8) d(2)
real(16) q
complex(8) z
equivalence (q, d), (q, z)
q = 1.0q0




在大端和小端上,d 的第一个元素都是 1.0d0,d 的第二个元素都是  0.0d0。复数 z 的实数部分是 1.0d0,虚数部分是 0.0d0。
16 字节实数和复数的元素字节顺序在大端和小端上是有所不同的,但元素顺序是相同的。
无格式数据文件无格式 Fortran 数据文件由记录和记录标记组成。记录标记是 4 或 8 个字节的整数,包含在记录的字节数。记录标记出现在每条记录之前和之后。请看下面的示例。
1
2
write(10) 10, 11
end




该程序将以下数据(二进制)写入连接到单元 10 的文件中:
1
0x00000008 0x0000000a 0x0000000b 0x00000008




因为记录标记是整数,所以它们会受到字节顺序的影响。此外,由于上述的 10 和 11 是整数,它们也会受到字节顺序的影响。因此,对于使用了某种字节顺序(例如,大端)的无格式数据文件,必须经过转换才可以在一个使用不同的字节顺序(例如,小端)的平台上进行读取。XL Fortran 提供几种方法来执行转换。按优先级从高到低分别是:
  • XLFRTEOPTS=ufmt_bigendian=<units> 和 XLFRTEOPTS=ufmt_littleendian=<units> 运行时选项
  • 在 OPEN 语句中的 CONVERT= 指定符
  • @PROCESS UFMT 指令
  • -qufmt 编译器选项
下面各节会更详细地介绍这些方法。
运行时转换的环境变量XLFRTEOPTS=xlf_bigendian=<units> 和 XLFRTEOPTS=xlf_littleendian=<units> 环境变量可以用来在运行时指定需转换的无格式数据文件的字节顺序。
XLFRTEOPTS=xlf_bigendian=<units> 仅在小端上有效,并用于连接到大端无格式数据文件的单元。
XLFRTEOPTS=xlf_littleendian=<units> 仅在大端上有效,并用于连接到小端无格式数据文件的单元。
对 xlf_bigendian 和 xlf_littleendian 均为 <units> 有效值的示例(以下示例显示 xlf_bigendian,但这些 <unit> 值也适用于 xlf_bigendian):
XLFRTEOPTS=xlf_bigendian=5
指定单元 5 连接到大端文件。

XLFRTEOPTS=xlf_bigendian=5-10
指定单元 5 至 10连接到大端文件。

XLFRTEOPTS=xlf_bigendian=1,5-10
指定单元 1 和 5 至 10 连接到大端文件。

XLFRTEOPTS=xlf_bigendian=1-
指定从 1 开始的所有单元连接到大端文件。

XLFRTEOPTS=xlf_bigendian=newunit
指定自动生成的所有单元连接到大端文件。自动生成的无格式单元在创建时带有负号。

XLFRTEOPTS=xlf_bigendian=1-,newunit 或 XLFRTEOPTS=xlf_bigendian=*指定所有单元连接到大端文件。
在 OPEN 语句中的 CONVERT= 指定符CONVERT= 指定符可以用来指定需转换的无格式数据文件的字节顺序。该指定符的有效值是:
CONVERT='NATIVE'
告诉编译器,该文件的字节顺序与本机平台相同,不需要转换。这是默认值。
CONVERT='BIG_ENDIAN'
告诉编译器,无格式文件使用大端字节顺序。在小端上,在对文件的双向数据传输操作上执行转换。在大端上,不需要执行转换。
CONVERT='BIG_ENDIAN'
告诉编译器,无格式文件使用小端字节顺序。在大端上,在对文件的双向数据传输操作上执行转换。在小端上,不需要执行转换。
源指令@PROCESS UFMT 源指令适用于在编译单元中其前面出现的所有 OPEN 语句。
@PROCESS UFMT(big endian)
假定 OPEN 语句被连接到大端数据文件。在小端上,在运行时对这些文件的双向数据传输执行转换。在大端上,不需要执行转换。
@PROCESS UFMT(little endian)
假定 OPEN 语句被连接到小端数据文件。在大端上,在运行时对这些文件的双向数据传输执行转换。在小端上,不需要执行转换。
-qufmt 编译器选项-qufmt 编译器选项允许用户指定在编译时要转换的无格式数据文件的字节顺序。
-qufmt=be
告诉编译器所有无格式数据文件都是大端。在小端上,在运行时对这些文件的双向数据传输执行转换。在大端上,不需要执行转换。

-qufmt=le
告诉编译器所有无格式数据文件都是小端。在大端上,在运行时对这些文件的双向数据传输执行转换。在小端上,不需要执行转换。
以反向字节顺序加载和存储XL Fortran 提供了以下内部过程来帮助转换字节顺序:
LOAD2R(X)
以反向字节顺序加载 X 的值,其中 X 是一个类型为 INTEGER(2) 的 INTENT(IN) 伪参数。结果的类型是 INTEGER(2)。
LOAD4R(X)
以反向字节顺序加载 X 的值,其中 X 是一个类型为 INTEGER(4) 的 INTENT(IN) 伪参数。结果的类型是 INTEGER(4)。
LOAD8R(X)
以反向字节顺序加载 X 的值,其中 X 是一个类型为 INTEGER(8) 的 INTENT(IN) 伪参数。结果的类型是 INTEGER(8)。
REVERSE_BYTE_ORDER(X)
是一个泛型函数,以反向字节顺序加载 X 的值,其中 X 是一个类型为 INTEGER(2)、INTEGER(4) 或 INTEGER(8) 的 INTENT(IN) 伪参数。它解析为 LOAD2R、LOAD4R 或 LOAD8R,具体情况取决于 X 的类型。其结果与 X 具有相同的类型和类型参数。
VEC_REVB(ARG1)
返回一个与 ARG1 相同类型的矢量,包含采用反向字节顺序的相应 ARG1 元素的字节。ARG1 是一个 INTENT(IN) 整数、无符号或实数矢量。
VEC_REVE(ARG1)
返回一个与 ARG1 相同类型的矢量,包含采用反向元素顺序的相应 ARG1 元素。ARG1 是一个 INTENT(IN) 整数、无符号或实数矢量。它返回一个与 X 相同类型的矢量,包含 INTENT(IN) 整数、无符号或实数矢量。
返回列表