PL/Iの「FIXED BINARY」の深淵へ:2バイトと4バイトの狭間で迷子にならないために
こんにちは。メインフレームの現場で何十年もコードと向き合ってきたアーキテクトです。
Javaで`int`や`short`に慣れ親しんだ皆さんが、初めてPL/Iのソースコードを開いたとき、おそらく「何だこの宣言は?」と戸惑うのが`FIXED BINARY`ではないでしょうか。COBOLの`PIC S9(4) COMP`と似ているようで、少しだけクセがある。
今回は、基幹システムの移行現場で避けては通れない「`FIXED BINARY(15)`と`(31)`」の正体について、現場の知見を交えて紐解いていきましょう。大丈夫、仕組みさえ分かれば怖くありません。
—
1. FIXED BINARYって何者?
PL/Iにおいて、`FIXED BINARY`は「符号付きの2進整数」を表します。
括弧の中の数字(精度)は「ビット数」です。ここが他の言語と大きく違うところで、「何桁か」ではなく「何ビット使うか」で宣言します。
- FIXED BINARY(15):合計15ビット + 符号1ビット = 合計16ビット(2バイト)
- FIXED BINARY(31):合計31ビット + 符号1ビット = 合計32ビット(4バイト)
そう、皆さんがJavaで言うところの`short`が`(15)`、`int`が`(31)`に近い存在です。
—
2. なぜ(15)と(31)なのか?(ここが重要!)
初学者が一番迷うのが「なぜ16や32ではなく、15や31なのか?」という点ですよね。
実はこれ、「符号ビットを除いた値の有効範囲」を指しているからなんです。
- FIXED BINARY(15)
- 範囲:-32,768 ~ +32,767
- 現場での立ち位置:メモリ節約用。昔の限られたリソースで動かしていた名残ですが、今でも大量の配列データを持つときには重宝します。
- FIXED BINARY(31)
- 範囲:約 -21億 ~ +21億
- 現場での立ち位置:メインフレームの標準。演算のデフォルトはこの型で行われることがほとんどです。
—
3. 演算時の「暗黙のオーバーフロー」に気をつけろ!
ここからが現場のエンジニアとしてお伝えしたい、一番の注意点です。
PL/Iは非常に柔軟な言語ですが、その柔軟さが仇になることがあります。例えば、`(15)`同士の加算結果を`(15)`の変数に代入する場合、計算途中で値が溢れる(オーバーフロー)と、コンパイラや実行時の設定によっては「何事もなかったかのように」上位ビットが切り捨てられることがあります。
コードで見る挙動の違い
1
/ メインプログラムの構造 /
SAMPLE: PROC OPTIONS(MAIN);
DCL VAL_SMALL FIXED BIN(15) INIT(30000);
DCL VAL_LARGE FIXED BIN(31) INIT(30000);
DCL RESULT_S FIXED BIN(15);
DCL RESULT_L FIXED BIN(31);
/ 30000 + 30000 = 60000 /
/ 60000はFIXED BIN(15)の限界(32767)を大きく超える /
RESULT_S = VAL_SMALL + VAL_SMALL;
/ ↑ここで「FIXEDOVERFLOW」が発生する可能性があります /
RESULT_L = VAL_LARGE + VAL_LARGE;
/ ↑こちらは余裕しゃくしゃく。安全です /
PUT SKIP LIST (‘RESULT_Sの値:’, RESULT_S);
PUT SKIP LIST (‘RESULT_Lの値:’, RESULT_L);
END SAMPLE;
現場からのアドバイス
もし既存のシステムで「計算結果がおかしい」というバグ調査を依頼されたら、真っ先に「宣言の精度(ビット数)と、計算結果が溢れていないか」を確認してください。特に古いプログラムを改修する際、うっかり`FIXED BIN(15)`の変数に大きな値を突っ込んでしまい、夜間バッチで数値が化ける…というのは、この業界の「あるある」です。
—
4. まとめ:怖がらずにこう付き合おう
最後に、PL/Iと上手く付き合うための「心得」をまとめておきますね。
1. 迷ったら(31)を使う:現代のメインフレームで数バイトのメモリを惜しむ必要はほぼありません。計算の安全性を確保するため、基本は`FIXED BINARY(31)`で宣言しましょう。
2. 型変換を意識する:`(15)`と`(31)`が混在する演算では、PL/Iは自動的に広い方(この場合は`(31)`)へ合わせて計算してくれます。これを「精度昇格」と言いますが、意識しておくとデバッグが楽になります。
3. コンパイラオプションを確認する:ソースコードだけでなく、JCL(実行ジョブ)のオプションで`FIXEDOVERFLOW`をチェックするように設定されているか確認する習慣をつけると、プロとしての信頼度がグッと上がります。
PL/Iは、一度馴染んでしまえば非常に強力で頼もしい相棒です。この「ビット単位でメモリを制御する」感覚を掴めれば、皆さんはもう立派なメインフレーム・エンジニアの仲間入りですよ!
次回は、PL/Iのもう一つの顔である「浮動小数点」や「文字列操作」について深掘りしていこうと思います。またお会いしましょう!
