Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.9, コンパイラーおよびランタイム 移行ガイド

SIZE が無効になっている場合の FIXEDOVERFLOW

新旧のコンパイラーのどちらでも、代入元を数値代入先に 代入しようとした場合に代入元の値が大きすぎると、SIZE 条件が発生しま す (SIZE 条件が有効になっている場合)。

ただし、SIZE 条件が有効になっていない場合は、プログラムは間違っ ており、どのような処理が発生するのかは予測できません。 このようなプログラムは修正する必要があります。

従来のコンパイラーでは、どのような条件も発生しない場合もあります。 例えば、次のプログラムを見てみましょう。

    dcl A fixed dec(3);
    dcl B pic'9';

    A = 123;
    B = A;

代入元 A の値は大きすぎて B には収まらないた め、SIZE 条件が有効になっている場合は、SIZE 条件が発生します。 しかし SIZE 条件が無効になっている場合は、従来のコンパイラーではど のような条件も発生しません。 これは、プログラムが正しいこと示しているのではなく、実際に はプログラムは間違っており、変更する必要があります。 例えば、BA の 1 の桁だけに設定する場合は、上 記のコードを次のように変更します。

    dcl A fixed dec(3);
    dcl B pic'9';

    A = 123;
    B = mod(A,10);

また、従来のコンパイラーでは、非常によく似たコードについて条件が発 生することがあります。 例えば、次のプログラムを見てみましょう。

    dcl X fixed dec(5);
    dcl Y fixed dec(4);
    dcl Z fixed dec(5);

    X = 99999;
    Y = X + 1;
    Z = X + 1;

X + 1 の値は大きすぎて YZ のど ちらにも収まらないため、SIZE 条件が有効になっている場合は、両方のステート メントについて SIZE 条件が発生します。 しかし SIZE 条件が無効になっている場合は、従来のコンパイラーでは Y への代入については何の条件も発生せず、Z への代 入については FIXEDOVERFLOW が発生します。この場合もまた、プログラムは間違っており、変更する必要があります。

新しいコンパイラーでは、これらのステートメントを一貫性を持って処理しますが、 結果は、有効であるターゲット属性とコンパイラー・オプションによって異なります。 SIZE 条件が使用不可で次のような条件がある場合、以下のようになります。

上記の説明は代入の場合にのみ適用されることに注意してください。 加算または乗算などの演算で、15 桁を超える (LIMITS(FIXEDDEC(15,31)) オプション が有効である場合には 31 桁を超える) 結果が生成される場合には、例外が発生します。 通常、発生する例外は FIXEDOVERFLOW ですが、生成されるマシン・インストラクション によっては、指定例外など、その他の例外が発生することがあります。

同様に、BIT 変数を FIXED BIN 変数に代入する時に、BIT 変数が大きすぎて有効に変換できず、SIZE が有効になっていなかった場合 (したがって、プログラムが無効だった場合)、次のようになります。

例えば、次のプログラムを見てみましょう。

    dcl A bit(32) aligned;
    dcl B fixed bin(31);

    A = '80000000'bx;
    B = A;

代入元 A の値は大きすぎて B には収まらないた め、SIZE 条件が有効になっている場合は、SIZE 条件が発生します。 新規のコンパイラーでは、SIZE 条件が無効になっている場合でも、このコードに対して SIZE 条件が発生します。 しかし SIZE 条件が無効になっている場合は、従来のコンパイラーではど のような条件も発生しません。 これは、プログラムが正しいことを示しているのではなく、実際には このプログラムは間違っており、変更する必要があります。


Terms of use | Feedback

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