Rational Developer for System z
PL/I for Windows, Version 7.6, プログラミング・ガイド

ランタイムの相違をもたらすデータ表記

ほとんどのプログラムは、データ表記を気にしなくても、同じように動作しますが、使用するプログラムでもそうなるようにするためには、以下のセクションで説明する相違について 理解しておく必要があります。

ワークステーション・コンパイラーは、データおよび浮動小数点の操作を、メインフレームと同じように 処理するようオペレーティング・システムに指示するオプションをサポートします。 コードをワークステーションに移すときに変更しなければならない場合のある すべてのメインフレーム・アプリケーションには、指定すべき DEFAULT コンパイル時オプションのサブオプションがあります。

コンパイル時オプションの詳細については、DEFAULTを参照してください。

ASCII 対 EBCDIC
ワークステーション・オペレーティング・システムは ASCII 文字セットを使用するのに対し、メインフレームは EBCDIC 文字セットを使用します。つまり、ほとんどの文字は異なる 16 進値を持ちます。 例えば、ブランクの 16 進値は、ASCII 文字セットでは '20'x であり、EBCDIC 文字セットでは '40'x です。

したがって、EBCDIC 16 進値の文字データに依存するコードは、ASCII を使用して実行すると、論理的に失敗する可能性があります。例えば、'40'x と比較してある文字がブランクかどうかをテストするコードは、ASCII を使用して実行すると失敗します。同じように、'OR' および '80'b4 を使用して文字を大文字に変更するコードは、ASCII を使用して実行すると失敗します。(ただし、TRANSLATE 組み込み関数を使用して大文字に 変換するコードは、失敗しません。)

ASCII 文字セットでは、数字は、'30'x から '39'x の 16 進値を持ちます。 ASCII の小文字「a」は 16 進値 '61'x を持ち、大文字「A」は 16 進値 '41'x を 持ちます。EBCDIC 文字セットでは、数字は、'F0'x から 'F9'x の 16 進値を持ちます。 EBCDIC では、小文字「a」は 16 進値 '81'x を持ち、大文字「A」は 16 進値 'C1'x を 持ちます。これらの相違によって、以下の興味深い結果がもたらされます。

このような相違があるため、文字ストリングのソートの結果は EBCDIC と ASCII では異なります。 多くのプログラムでは、このことの影響はありませんが、プログラムが、いくつかの文字ストリングをソートする正確な順序に依存する場合は、論理エラーが発生する可能性に注意する必要があります。

ASCII から EBCDIC への変換については、データ変換表の使用を参照してください。

ネイティブ 対 非ネイティブ
パーソナル・コンピューター (PC) は、メインフレームまたは AIX の形式と比較すると、バイトが反転された形式で整数を保持します。このことは、例えば、値 258 を保持する FIXED BIN(15) 変数 (256+2 に等しい) は、Windows のストレージでは '0201'x、AIX またはメインフレームでは '0102'x として保持されることを意味します。 同じ値を持った FIXED BIN(31) 変数は、Windows では '02010000'x、AIX またはメインフレームでは '00000102'x として保持されます。

AIX およびメインフレームの表記は、ビッグ・エンディアン (Big End In) と呼ばれます。

Windows の表記は、逆に、リトル・エンディアン (Little End In) と呼ばれます。

内部表記のこの相違は、以下のものに影響します。

ほとんどのプログラムで、この相違は問題を引き起こしません。ただし、使用するプログラムが 16 進値の整数に依存する場合は、論理エラーの可能性に注意する必要があります。 そのような従属関係は、FIXED BINARY 引数を持った UNSPEC 組み込み関数を使用する場合、または BIT 変数が FIXED BINARY 変数のアドレスに基づく場合に存在する可能性があります。

プログラムが、ポインターを整数と同様に扱う場合は、データ表記の相違が問題を引き起こす場合があります。DEFAULT(NONNATIVE) を指定するときは、ほとんどの場合、DEFAULT(NONNATIVEADDR) も指定する必要があります。

選択した宣言で NONNATIVE 属性を指定できます。例えば、以下のステートメントの代入によって、構造体のすべての FIXED BIN 値は非ネイティブからネイティブ に変換されます。

    dcl
      1 a1 native,
        2 b   fixed bin(31),
        2 c   fixed dec(8,4),
        2 d   fixed bin(31),
        2 e   bit(32),
        2 f   fixed bin(31);
    dcl
      1 a2 nonnative,
        2 b   fixed bin(31),
        2 c   fixed dec(8,4),
        2 d   fixed bin(31),
        2 e   bit(32),
        2 f   fixed bin(31);

    a1 = a2;
IEEE 対 HEXADEC
ワークステーション・オペレーティング・システムは、IEEE 形式を使用して浮動小数点データ を表しますが、メインフレームは伝統的に、16 進形式を使用します。

表 1 は、正規化浮動小数点の IEEE と 16 進との相違の要約です。

表 1. 正規化 IEEE 対正規化 16 進
仕様 IEEE (AIX) IEEE (PC) 16 進数
値のおよその範囲 ±10E-308 から ±10E+308 ±3.30E-4932 から ±1.21E+4932 ±10E-78 から ±10E+75
FLOAT DECIMAL の最大精度 32 18 33
FLOAT BINARY の最大精度 106 64 109
FLOAT DECIMAL 指数の最大桁数 4 4 2
FLOAT BINARY 指数の最大桁数 5 5 3

16 進浮動小数点は、short 浮動小数点、long 浮動小数点、および拡張浮動小数点で同じ最大および最小の 指数値を持ちますが、IEEE 浮動小数点は、short 浮動小数点、long 浮動小数点、および拡張浮動小数点で異なる 最大および最小の指数値を持ちます。つまり、1E74 (PL/I では、属性 FLOAT DEC(1) を持つ必要がある) は有効な 16 進の short 浮動小数点ですが、有効な IEEE の short 浮動小数点ではありません。

ほとんどのプログラムで、FIXED BIN 変数の表記の相違が問題を引き起こさないのとまったく同じように、これらの相違は問題を引き起こしません。ただし、使用するプログラムが、16 進値の浮動小数点値に依存する場合は、コーディングの際に注意が必要です。

また、FIXED BIN の計算は、上で説明した内部表記に依存しない同じ結果をもたらしますが、浮動小数点の計算は、必ずしも同じ結果をもたらすとは限りません。これは、浮動小数点値を表現する方法に相違があるためです。このことは、特に、short 浮動小数点および拡張浮動小数点について当てはまります。

EBCDIC DBCS 対 ASCII DBCS
EBCDIC DBCS ストリングはシフト・コードで囲みますが、ASCII DBCS ストリングはシフト・コードでは囲みません。同じ文字を表現するために使用する 16 進値も異なります。

この場合も、ほとんどのプログラムでこのことは問題になりません。 使用するプログラムが、16 進値の GRAPHIC ストリングに依存する場合、または混合文字およびグラフィック・データを含む文字ストリングに依存する場合は、コーディングの際に注意が必要です。


Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)