COBOLエンジニアへ送るCOMP-3
COBOLエンジニアの方々、こんにちは。
本記事は、COBOLに触れて間もない方が、確実にぶち当たるであろう、COMP-3について解説いたします。
ただし、ここでは文字コードはEBCDICとします。
目次
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
です。
これは、「なんで?」とは考えず、そういうものだとして覚えてください。
別に知らなくても実務レベルでは全く問題ないです。(きっと)