LoginSignup
4
3

More than 3 years have passed since last update.

サルでもわかるCOMP-3(パック10進数)

Posted at

COBOLエンジニアへ送るCOMP-3

COBOLエンジニアの方々、こんにちは。
本記事は、COBOLに触れて間もない方が、確実にぶち当たるであろう、COMP-3について解説いたします。
ただし、ここでは文字コードはEBCDICとします。

目次

  1. COMP-3とは?
  2. COM-3をもう少し詳しく
  3. COM-3の桁数計算方法
  4. COMP-3の末尾の「C」の意味

COMP-3とは?

まず、COMP-3がなんなのか、ざっくり説明いたします。
COMP-3とは、COBOLで数値を宣言するときに使われるます。
このとき、変数用に確保される領域を削減する宣言方法です。
要は、領域の節約ですね。

COM-3をもう少し詳しく

COBOLで、いわゆる変数を定義するときには、大別して「文字」と「数値」があります。
文字であれば、X
数値であれば、9
で宣言しますね。
このとき、例えば、「123」を「9」で宣言した場合、16進数では、
F1F2F3
となります。
(なぜ、Fなのかは、文字コード表を見てください。)
このとき、各桁は1Byteで表現されます。
つまり、桁数=Byte数、ということになりますね。
パット見てわかるように、桁数が大きくなるほどバイト数も比例して大きくなります。
1桁ごとに無駄に「F」が表記されるので、正直無駄ですね。
このムダを省くために使われるのが、COMP-3です。
COMP-3で「123」を表現すると、次のようになります(16進数)。
123C
これは、2Byteですね。
(末尾のCの意味は後述。)
よって、「9」から、COMP-3にすることで、1Byteの節約になりました。
例では、たった1Byteの削減ですが、これが桁数が大きくなるほど効果的になります。
例えば、10進数で10桁の場合、
9 →    10Byte
COMP-3 → 6Byte
こうなります。
4Byteの節約になりましたね。

COM-3の桁数計算方法

COM-3では、上述のように、桁数を削減できることがわかりました。
では、10進数のときの桁数が、実際は何桁に削減されるのか、計算方法を学んでみましょう。
計算式は至ってかんたんです♪

(桁数)/2+0.5 の小数点以下繰り上げ

です。
例えば、123(10進数)なら、
3桁 / 2 + 0.5 = 2.0 => 2Byte
1234(10進数)なら。
4桁 / 2 + 0.5 = 2.5 => 3Byte
となります。
かんたんですね。

COMP-3の末尾の「C」の意味

COMP-3で宣言したとき、16進数で見ると、必ず末尾に「C」もしくは、「D」が入ります。
「えっ、Dはどこからでてきたの??」という方、安心してください。
ここで初めて言いました。これから説明します。
簡単に言いましょう。
C => 正の数
D => 負の数
ということです。
123Cなら、2Btyeの正の数、123
01234Dなら、3Byteの負の数、1234
です。
これは、「なんで?」とは考えず、そういうものだとして覚えてください。
別に知らなくても実務レベルでは全く問題ないです。(きっと)

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3