コンピュータは数を2進数で表す。しかし、人間がキーボードから入力した数字が、コンピュータの中ですぐに2進数に変換されるわけではない。なぜならばキーボードの数字は一種の文字だからである。
また、10進数と2進数との間の誤差の回避や、データ入力時には10進数を使うことなどから、10進数のままデータを処理するほうが都合がよいこともある。
そうした場合に使われる表現方法として、BCDコード・ゾーン10進数・パック10進数がある。
2進数であれば4ビットで0〜15を表現可能であるが、BCDは2進化10進数であるため4ビットで0〜9までの数値を表現する。
[例]89という数字をキーボードで入力したら、すぐに1011001になるわけではなく、まず10進数を1桁ずつ2進数にする。即ち8と9をそれぞれ2進数にする。すると、1000と1001になる。これを連結して「10001001」にする。これをBCDコードという。 ◇
[補講]実際にはBCDコードが使われるわけではなく、「BCDコードを含むコード」(「BCDコード+α」という意味)になる。このBCDコードを含むコードというのがゾーン10進数やパック10進数である。 ◇
文字データや10進数との対応が取りやすいように、10進数の0〜9に対応した4ビットの2進数で10進数の各桁を表現する方法をBCDコード(Binary Coded Decimal code:2進化10進コード)という。
BCDコードでは、4ビットを単位として0000〜1001(2進数)までの0〜9(10進数)に対応させて、1011〜1111は使用しない。
10真数の桁数に合わせて2進数の桁数も変化する可変長形式の表現である。
BCD同士の演算(例えば加算など)のときは桁上がり値を適切に確保する必要がある。これを考慮して、8ビットで1桁の10進数(0〜9)を表現するBCDがある。これアンパック形式BCDという。これに対して、4ビットで1桁の10進数を表現するBCDをパック形式BCDという。
ゾーン10進数(アンパック10進数、アンパック形式BCD)とは、10進数の1桁を1バイト(=8ビット)で表現する。
上位4ビットをゾーン部、下位4ビットを整数部という。
整数部はBCDコードと同じ表現を用いる。
ゾーン部はJISコード形式では(0011)2、汎用コンピュータで用いられるEBCDIC形式では(1111)2を割り当てる。これは0〜9の値をそのままそれぞれコード形式の'0'〜'9'に対応させることになるので、10進数値と文字コードの対応が取れて都合がよい。
ただし、最下位桁のゾーン部は符号部として使用する。一般に0と正の場合は(1100)2、負の場合は(1101)2を割り当てる。
例1:JISコード形式の「123」と「-123」
例2:EBCDICコード形式の「123」と「-123」
例えば90をBCDコードにすると、「1001 0000」になる。一方、ゾーン10進数では9の「1001」に「0011」という数字列を頭につけて、10進数の1桁の9を「0011 1001」と表す。つまり、ゾーン10進数では各桁ごとに「0011」を付けるわけである。実は、これはJISコードそのものなのである。
8ビットのJISコードでは、0011の列、即ち3の列が数字になっている。JISコード表を実際に確認してもらえればわかると思うが、3列0行目〜3列9行目が0〜9に対応している。
つまり、9という文字を指定するのに、39という数字、2進数でいえば「0011 1001」を使う。この8ビットコードが「0011 1001」の下4桁がBCDということになる。
また、JISには他にEBCDIC(拡張2進化10進コード)というコードもある。このときは、頭に「1111」を付ける。
以上のように頭に付ける「0011」や「1111」のことをゾーン部という。
パック10進数表記法とは、BCD(2進化10進数)コードを使い、10進数の各桁の値を4ビットの2進数で表現する方法である。そのため、1バイト(=8ビット)に10進数の2桁を記憶できる。
また、符号は最下位バイトの下位4ビットに入れる。正負をどのようなビットの並びで表すかは、システムによって異なる。
パック10進数表記法の長さは、バイト単位で決定されるので、6桁であっても7桁であっても4バイト(=32ビット)分必要になる。-9,999,999から+9,999,999まで(10進数)の数値を扱うことができる。
例:数値の部分が6桁の符号付き10進数「-123456」だと次のようになる。
パック10進数はゾーン10進数に比べて、使用するバイト数が小さくてすみ、ゾーン部がないため演算が可能であるというメリットがある。必要とするバイト数は、ゾーン10進数が10進数の桁数分のバイト数が必要である。一方、パック10進数では10進数が偶数桁か奇数桁かで変化する。
[1]偶数桁n桁の場合
[2]奇数桁n桁の場合
ガウスのfloor funcitonを用いると、2つの式を次のようにひとつに統一できる。
データの入出力には文字コードと同じ1バイト単位のゾーン10進数が便利である。一方、演算時には10進演算か2進の固定小数点演算か浮動小数点演算の適する形式に変換される。
命令 | 意味 |
AAA | アンパック形式BCD値同士を加算(ADD)した結果をBCD表現に戻す。 |
AAS | アンパック形式BCD値同士を減算(SUB)した結果をBCD表現に戻す。 |
AAM | アンパック形式BCD値同士の乗算(MUL)した結果をBCD表現に戻す。 |
AAD | アンパック形式BCD値同士の除算(DIV)を実行する前に、非除数(分子)をバイナリに変換して、BCD計算が正しく行われるように準備する。 |
DAA | パック形式BCD値同士の加算(ADD)した結果をBCD表現に戻す。 |
DAS | パック形式BCD値同士を減算(SUB)した結果をBCD表現に戻す。 |
[補講]サンプルプログラム1、サンプルプログラム2 ◇