本文へスキップ
BecomeCoder

COBOLコース · 第10章 実務のCOBOL ― パック10進・帳票・メインフレーム · レッスン49

COMP/COMP-3 ― バイナリとパック10進

ローカル実施

導入

第3章でPICTURE句を学んだとき、PIC 9(7) のような数値項目は「1桁につき1バイト」でメモリに保存されると説明しました。しかし実務では、もっとメモリを節約できる数値の持ち方が使われます。ここで登場するのが USAGE句(利用形式)、特に COMPCOMP-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 を切り上げた値になります。

もう一つ、COMP2進数・バイナリ)という形式もあります。

       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バイトになります)。