【COBOL学習|実務向け】SIGN IS SEPARATE 指定時の桁数計算とメモリレイアウトの注意点

1. 導入

COBOLの数値項目において、符号を独立した文字として扱う「SIGN IS SEPARATE」句は、外部システムとのデータ連携や、帳票出力時に符号を明示する必要がある場面で多用されます。しかし、この指定を忘れると「PICTURE句の桁数」と「実際のメモリサイズ」の認識にズレが生じ、ファイルレイアウトの破壊や、データ転送時のエラーを引き起こす原因となります。本記事では、この指定がメモリに与える影響と、設計時に注意すべき計算方法を解説します。

2. 基礎知識

通常、COBOLの符号付き数値(PIC S9…)は、内部的に「ゾーン10進数」として扱われ、最後の桁に符号が含まれる形式(符号込み表現)が一般的です。一方、「SIGN IS SEPARATE」を指定すると、符号が数値とは別の1バイトとして独立します。

例えば、PIC S9(3) の場合:
・通常:3バイト(最後の桁に符号が含まれる)
・SIGN IS SEPARATE指定時:4バイト(数値3バイト+符号1バイト)

このように、定義した桁数にプラス1バイトが必要になる点が、設計において最も重要なポイントです。

3. 実装/解決策

ファイル設計書やコピー句を作成する際は、必ず「PICTURE句の桁数 + 1」をバイト数として計算してください。特に固定長ファイルや通信電文の定義では、この1バイトのズレが後続の全項目のオフセットを狂わせ、致命的なバグとなります。設計時には、必ずメモリダンプやコンパイラのマップリストを確認し、期待通りのサイズになっているか検証する癖をつけましょう。

4. サンプルプログラム

以下に、SIGN IS SEPARATEを使用した数値の定義と、そのサイズを確認するためのサンプルコードを示します。

プログラム:
IDENTIFICATION DIVISION.
PROGRAM-ID. SIGN-TEST.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • 3桁の符号付き数値、符号は独立した1バイトとして確保される(計4バイト)

05 WS-VAL-SEPARATE PIC S9(3) SIGN IS SEPARATE.

  • 比較用:通常の3桁符号付き数値(計3バイト)

05 WS-VAL-NORMAL PIC S9(3).

PROCEDURE DIVISION.
MOVE -123 TO WS-VAL-SEPARATE.
MOVE -123 TO WS-VAL-NORMAL.

  • 表示確認

DISPLAY “SEPARATE指定時: ” WS-VAL-SEPARATE
DISPLAY “通常指定時 : ” WS-VAL-NORMAL

  • 実際のメモリ上の挙動を意識することが重要です

STOP RUN.

5. 応用・注意点

現場でよくある失敗として、「REDEFINES句での再定義」時にサイズを誤るケースがあります。SIGN IS SEPARATEを指定した項目を別の型で再定義する場合、元の項目が「桁数+1」であることを考慮しないと、メモリ領域がオーバーラップしてしまいます。

また、古いCOBOLコンパイラでは符号の文字コード(’+’や’-‘)に依存する処理があるため、文字コードセット(EBCDICやASCII/UTF-8)による差異にも注意が必要です。設計段階で「符号は本当に1バイト分必要か」「後続のフィールドと整合性が取れているか」を、必ずレイアウト図面上で指差し確認するようにしてください。

コメント

タイトルとURLをコピーしました