導入
第3章でPICTURE句を学んだとき、PIC 9(7) のような数値項目は「1桁につき1バイト」でメモリに保存されると説明しました。しかし実務では、もっとメモリを節約できる数値の持ち方が使われます。ここで登場するのが USAGE句(利用形式)、特に COMP と COMP-3 です。
説明
これまで使ってきた素の PIC 9(n) は、正式には USAGE IS DISPLAY(既定値なので省略されている)と呼ばれる形式です。1桁が1バイトを占める、最もシンプルな形式です。
01 WS-AMOUNT-DISPLAY PIC 9(7) VALUE 1234567.
*> DISPLAY形式:7桁 → 7バイト使用
これに対し、COMP-3(パック10進数)は、1バイトに2桁分を詰め込んで保存する形式です。
01 WS-AMOUNT-PACKED PIC 9(7) COMP-3 VALUE 1234567.
*> COMP-3形式:7桁 → 4バイトで収まる((7+1)÷2 を切り上げ)
graph TD
subgraph zoned["DISPLAY形式(9(7)=7バイト)"]
Z["各バイトに1桁ずつ<br/>1 | 2 | 3 | 4 | 5 | 6 | 7"]
end
subgraph packed["COMP-3形式(パック10進・7桁=4バイト)"]
P["各バイトに2桁ずつ詰め込み、<br/>最後の半バイトが符号<br/>12 | 34 | 56 | 7+"]
end
COMP-3 は、1バイト(8ビット)を上位4ビット・下位4ビットの「半バイト(ニブル)」2つに分け、それぞれに0〜9の数字を1つずつ詰め込みます。最後の半バイトだけは符号(プラス/マイナス)に使われるため、桁数がnのとき、必要なバイト数はおよそ (n + 1) ÷ 2 を切り上げた値になります。
もう一つ、COMP(2進数・バイナリ)という形式もあります。
01 WS-COUNT-BINARY PIC 9(9) COMP.
*> COMP形式:9桁の整数を、コンピュータが直接扱える2進数として保存
3つの形式をまとめます。
| USAGE | 別名 | 特徴 |
|---|---|---|
DISPLAY(既定) | ゾーン10進 | 1桁1バイト。人間が読みやすい形式のまま保存される |
COMP-3 | パック10進 | 1バイトに2桁。ディスク容量を節約でき、金額計算にも向く |
COMP | バイナリ(2進数) | コンピュータが最も高速に計算できる形式 |
なぜこの違いが重要なのでしょうか。大量のデータを扱うバッチ処理では、1件あたりのバイト数がわずかに減るだけで、ファイル全体のサイズや処理速度に大きな差が生まれます。数百万件のレコードを扱う金融システムでは、COMP-3 がディスク容量と処理性能の両面で長年重宝されてきました。実務のCOBOLプログラムのレコード定義を見ると、金額や件数の項目に COMP-3 が付いていることが非常に多いはずです。
試すには
PIC 9(9) COMP-3 の項目と PIC 9(9)(DISPLAY形式)の項目を並べて宣言し、それぞれが何バイトのメモリを使うか計算してみましょう(COMP-3は (9+1)÷2 = 5バイト、DISPLAYは9バイトになります)。