ここでは、Fortran データ型の機能と拡張子について説明します。
f95 では、ブール型の定数と式をサポートしています。ただし、ブール型の変数、配列、文はサポートしていません。
マスク処理の場合、ビット単位の論理式ではブール型の結果が生成されます。個々のビットは、対応する演算対象のビットで行われた 1 つまたは複数の論理演算の結果を表します。
2 進の算術演算子および関係演算子では、次のように処理されます。
一方の演算対象がブール型の場合は、そのまま演算が実行されます。
両方の演算対象がブール型の場合は、両者を整数であるとみなして演算が実行されます。
ユーザー定義の関数によってブール型の結果を生成することはできません。ただし、一部の (標準でない) 組み込み関数では可能です。
ブール型と論理型には、次のような相違点があります。
変数、配列、関数は論理型にできますが、ブール型にすることはできません。
LOGICAL 文はありますが、 BOOLEAN 文はありません。
論理型の変数、定数、または式は、2 つの値 .TRUE. または .FALSE. だけしか表しません。ブール型の変数、定数、または式は、任意のバイナリ値を表すことができます。
論理要素は、算式、関係式、またはビット単位の論理式において無効です。ブール要素はいずれにおいても有効です。
f95 では、ブール型定数 (8 進、16 進、ホレリス) を、次のような書式 (2 進ではありません) で使用することができます。ただし変数はブール型として宣言できません。標準の Fortran では、このような書式は許されていません。
B または b のどちらの文字を使用してもかまいません。
1 桁から 11 桁までの 8 進数 (0 から 7) を使用できます。
11 桁の 8 進数は 32 ビットの完全なワードを表します。左端の数字は常に 0、1、2、3 のいずれかです。
8 進の個々の数字は 3 ビットの値を表します。
右端の桁は、右 3 ビット (29、30、31 ビット) の内容を表します。
11 桁未満の場合は、値は右揃えになります。ワードの右端にある n ビットから 31 ビットまでが使用され、それ以外のビットは 0 になります。
空白は無視されます。
入出力の書式指定では、B という文字は 2 進数であることを示しますが、それ以外の場合は 8 進数であることを表します。
X'ddd' または X"ddd"、d が任意の 16 進数である の書式です。
1 桁から 8 桁までの 16 進数 (0 から 9、A から F) を使用できます。
文字は大文字でも小文字でもかまいません (X、x、A から F、a から f)。
数字は引用符 (アポストロフィ) または二重引用符で囲む必要があります。
空白は無視されます。
16 進数の始めに + か - の記号を付けてもかまいません。
8 桁の 16 進数は 32 ビットの完全なワードを表しています。この 32 ビットワードの各ビットの内容は、同じ値を表す 2 進数に対応しています。
8 桁未満の場合は、値は右揃えになります。ワードの右端にある n ビットから 31 ビットまでが使用され、それ以外のビットは 0 になります。
ホレリスデータには、次の書式を使用できます。
nH… |
'…'H |
"…"H |
nL… |
'…'L |
"…"L |
nR… |
'…'R |
"…"R |
前述の「…」は文字列を表し、n は文字数を表します。
例: 8 進と 16 進の定数の表現例を示します。
ブール型定数 |
1 ワード 32 ビットでの内部の 8 進数 |
---|---|
0B |
00000000000 |
77740B |
00000077740 |
X"ABE" |
00000005276 |
X"-340" |
37777776300 |
X’1 2 3’ |
00000000443 |
X’FFFFFFFFFFFFFFFF’ |
37777777777 |
例: 代入文での 8 進と 16 進の使用例を示します。
i = 1357B j = X"28FF" k = X’-5A’ |
算術式の中で 8 進数または 16 進数の定数を使用すると、結果が未定義になることがあります。ただし、構文エラーにはなりません。
f95 では、DATA 文以外の場所で BOZ 定数を使用することができます。
B’bbb’ |
O’ooo’ |
Z’zzz’ |
B"bbb" |
O"ooo" |
Z"zzz" |
このような BOZ 定数が実数変数に代入されている場合には、型は変換されません。
標準の Fortran では、BOZ 定数は DATA 文でのみ使用できます。
f95 では、宣言文、関数文、IMPLICIT 文において、次のような非標準の書式で型を宣言することができます。1 列目の形式は一般に使用されていますが、非標準の Fortran です。2 列目の種別番号はベンダーにより変わります。
表 4–2 数値データ型のサイズの表記法
非標準 |
宣言子 |
短縮書式 |
意味 |
---|---|---|---|
INTEGER*1 |
INTEGER(KIND=1) |
INTEGER(1) |
1 バイトの符号付き整数 |
INTEGER*2 |
INTEGER(KIND=2) |
INTEGER(2) |
2 バイトの符号付き整数 |
INTEGER*4 |
INTEGER(KIND=4) |
INTEGER(4) |
4 バイトの符号付き整数 |
LOGICAL*1 |
LOGICAL(KIND=1) |
LOGICAL(1) |
1 バイト論理型 |
LOGICAL*2 |
LOGICAL(KIND=2) |
LOGICAL(2) |
2 バイト論理型 |
LOGICAL*4 |
LOGICAL(KIND=4) |
LOGICAL(4) |
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 の 4 倍精度浮動小数点数 (16 バイト) |
COMPLEX*8 |
COMPLEX(KIND=4) |
COMPLEX(4) |
単精度複素数 (各部に 4 バイト) |
COMPLEX*16 |
COMPLEX(KIND=8) |
COMPLEX(8) |
倍精度複素数 (各部に 8 バイト) |
COMPLEX*32 |
COMPLEX(KIND=16) |
COMPLEX(16) |
4 倍精度複素数 (各部に 16 バイト) |
記憶領域および整列は常にバイト単位で表されます。シングルバイトに収まる値は、バイト整列です。
データ型のサイズおよび整列は、コンパイラのオプションとプラットフォーム、および変数の宣言方法に依存します。COMMON ブロック内のデフォルトの最大の整列は、4 バイトの境界整列です。
デフォルトのデータ整列および記憶領域の割り当ては、-aligncommon、 -f、-dalign、-dbl_align_all、-xmemalign、および -xtypemap などの特別なオプションを指定してコンパイルすることにより、変更できます。このマニュアルは、これらのオプションが有効でないものとして記述されています。
いくつかのプラットフォームにおける特殊ケースのデータ型および整列については、『Fortran プログラミングガイド』に追加の説明があります。
デフォルトのサイズおよび整列を次の表にまとめます (データ型のその他の点およびオプションは考慮していません)。
表 4–3 デフォルトのデータサイズおよび整列 (バイト)
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*16 および COMPLEX*32: 64 ビット環境 (-m64 を指定してコンパイル) では、デフォルトの整列は、表で 8/16 と示されるように、8 バイトではなく 16 バイト境界整列になります。このデータ型は、4 倍精度とも呼ばれます。
配列および構造体は、その要素または欄に従って整列します。配列は、配列要素と同じように整列します。構造体は、もっとも広い整列で整列する欄と同じように整列します。
オプション -f または -dalign は、8、16、または 32 バイトのデータすべてを、強制的に 8 バイト境界で整列させます。オプション -dbl_align_all の場合は、すべてのデータが 8 バイト境界で整列します。これらのオプションを使用するプログラムには、移植性がない場合があります。