二進化十進表現

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

二進化十進数 (BCDBinary-coded decimal ) とは、コンピュータにおける数値の表現方式の一つで、十進法の1桁を、0から9までを表す二進法の4桁で表したものである。「二進化十進符号」などとも呼ばれる。3増し符号など同じ目的の他の方式も含めることもある。

一般に4桁の二進数は、0から15までの整数を表すことができるが、二進化十進法ではこのうちの最初の10個を有効な数値として扱う。

十進法 BCD表現
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001

例えば 127 という十進数は、 0001、0010、0111 という3つのBCDで表される。

二進化十進数には、ゾーン形式とパック形式があり、用途に応じて使い分けられる。

符号部を持たないパック形式では、ファイルなどの中の二進化十進数値を十六進数で表示すると十進数と同じように表示される(例えば、十六進数で「1234」と表示されるデータがあれば、十進数の「1234」のことである)。また、ゾーン形式では(機種や文字コードに依存するが、一般に)8ビット文字表示すると十進数と同じように表示される。ただし、符号部を持つ場合も多く、上記の表示が必ずしもわかりやすいとは言えないこともある。

簡単な利用法としては、電子回路上で、0 - 9を表示可能なBCD対応の数字表示素子1つに対してBCDの4桁を4本の入力信号として直接入力する、等の使われ方がある。二進数(または十六進数)で扱う場合と違い、表示素子に入力する前の変換が要らずデータバス上の信号をそのまま利用できるというメリットがある。

二進法で計算を行う多くのコンピュータでは、二進化十進表現を使用する機能(または、計算結果を補正するための機能)を備えている。

本来、コンピュータでは二進数で演算するのがコンピュータ資源(レジスタ、メモリ、計算量)の有効利用になる。それでも二進化十進数が有効な場合があるのは、二進数と十進数との変換を回避することに「社会的な価値」があるからである。つまり二進化十進数は純粋なコンピュータの問題ではなく、十進数社会という現実からの要請による。コンピュータの能力が上がれば上がるほど、十進数への変換を必要としないというメリットより、数値どうしの演算に手間がかかるというデメリットのほうが大きくなり、計算には二進数を使ったほうがよくなる。

「社会的な価値」の具体例として、小数の丸め処理が挙げられる。小数 0.1 は十進数では有限桁で表記できるが、二進数では無限桁の循環小数となる。このため、入力値が十進数表現で有限桁の小数で定義されている場合に、二進数表現で丸め誤差を考慮せずに計算を進めると、十進数での演算では発生しなかった誤差が蓄積される可能性がある。例えば以下の Java プログラムを実行すると、double 型を使って 0.1 を 10,000 回加えた結果は 1,000.0 ではなく 1,000.0000000001588 となることがわかる。このような問題を避けるため、処理対象の値が十進の場合は、コンピュータ内の処理も二進化十進数で実装されることが少なくない。通貨を扱う事務アプリケーションなどが、しばしばこのケースに該当する。

public static void main(String[] args) {
    double sum = 0.0;
    for (int i = 0; i < 10000; i++)
        sum += 0.1;
    System.out.println("sum = " + sum);
}

バイナリエディタで十六進数で実データを見ると分かりやすい。通常のコードでは十進数での0 - 9の1桁を表現するのに十六進数を基準にコード化した状態では30 - 39(ASCIIコード)やF0 - F9(EBCDICコード)などで表示されるが、二進化十進表現では十六進数を基準にコード化した場合でも単純に0 - 9となる。

ただしBCDは、通常はEBCDICコード化の事である。十六進化した場合に30 - 39かF0 - F9かの違いでしかない場合が多い。アプリケーションの計算速度の上で内部計算用データエリアの持ち方として意識される場合もあるが、二進数のまま扱う任意精度浮動小数点数データエリア化の方が一般的である。メモリバス幅の狭かった時代の名残である。

メモリエディタ・バイナリエディタなどでリアルタイムに十六進数表現で十進数のように見ることができるために端末間での通信インタフェイス形式やアプリケーション間での受け渡しインタフェイス形式として存在している場合があるが、実際には分かりやすいベタデータをインタフェイス上に流す必要もなく、しかも十六進数化した際にエリアに無駄があるので単純に二進数化される場合が多い。

関連項目