目次

008.BCD(二進化十進数)

Binary-coded decimal の略。2進数4ビットで10進数の0~9を扱う方式・方法。

BCD

1920年あたりには自然発生していた考え方で、複数のハードウエアメーカーが採用していた。 普及させたのはIBMと言われている。1950年台は十進数の計算機構をもつ計算機が主流だった。

二進化十進数にはゾーン形式とパック形式(パックドデシマル形式)があり、ゾーン形式は1バイトで1桁、パック形式は1バイトで2桁を表す。
1964年にIBMが数字以外の文字も含めて体系化したEBCDICを発表しこれが事実上の標準となった。

BCDを利用すると二進数で扱いが厳しい値を扱う事が出来る。

一般的に知られているが、二進数では #6 の値(10進数の 0.1)を表現できない。近似値にするしかないので、#6 の例だと近似値 0.0625 になってしまう。
小数点以下を8bitにして計算を行っても 0.09765625 である。

BCDであれば二進数での問題を回避できる。 ただし表現の話であって演算結果も解決できる訳ではない。
二進化十進数の演算でも 1 ÷ 3 × 3 = 1 にはならないので注意。二進化十進数の演算で全て解決するわけではない。

パック形式、小数点以下1位の符号なしの値で比較(16進数表記を併記)

# 10進数 2進数(12bit表記) 2進化10進数(3桁)
1 16.0 0001 0000.0000 0x10.0 0001 0110.0000 0x16.0
2 10.0 0000 1010.0000 0x0A.0 0001 0000.0000 0x10.0
3 5.0 0000 0101.0000 0x05.0 0000 0101.0000 0x05.0
4 1.0 0000 0001.0000 0x01.0 0000 0001.0000 0x01.0
5 0.5 0000 0000.1000 0x00.8 0000 0000.0101 0x00.5
6 0.1 * 0000 0000.0001 0x00.1 0000 0000.0001 0x00.1
7 0.0 0000 0000.0000 0x00.0 0000 0000.0000 0x00.0

2進数の小数点以下を8桁に拡張。

10進数 2進数
1.00000000 1.00000000
0.50000000 0.10000000
0.25000000 0.01000000
0.12500000 0.00100000
0.06250000 0.00010000
0.03125000 0.00001000
0.01562500 0.00000100
0.00781250 0.00000010
0.00390625 0.00000001
   0.06250000    0.00010000
   0.03125000    0.00001000
 + 0.00390625  + 0.00000001
 ------------- ---------------
   0.09765625    0.00011001     近似値にしかならない

BCDIC

BCDを体系化したのが BCDICになる。
これは数字以外を扱うため、パンチカードをベースに ゾーン + BCD 4bit を 6bit に拡張し数字以外も扱えるようにしたもの。64種の文字を扱えるようになる。

パンチカードには 12,11,0~9 のゾーンパンチ/数字パンチと呼ぶ行があり、列方向(縦方向)に穿孔した穴の位置組み合わせで文字を表現する。 ゾーンパンチ12,11の組み合わせと、数字パンチ0~9で表す文字を 6bit で表現し直したものが BCDIC となる。

BCDIC はパンチカードの穿孔位置で示す文字と1対1に対応するが、用途やメーカー、システムにより文字の配置が異なる。

以下は IBM 716 printer Fortran character set 。FORTRAN言語のコーディング用で使われたもの。不等号文字がないのは、言語仕様で不等号を表すための記述があるから。
例 A > B → A .GT. B

ゾーン 上位
下位 0 1 2 3
0 * + - 0
1 1 A J /
2 2 B K S
3 3 C L T
4 4 D M U
5 5 E N V
6 6 F O W
7 7 G P X
8 8 H Q Y
9 9 I R Z
A
B = . $ ,
C - ) * (
D
E
F

EBCDIC

IBMが発表して事実上の標準となったコード体系。BCDICの拡張なのでEBCDICとなる。 101.EBCDICコード表を参照。

コードは 上位ニブル + 下位ニブル で構成され、ゾーン形式では上位ニブルをゾーン部(文字種)、下位ニブルを数字/数値としている。 ただしゾーン別けは厳密では無いようで、せいぜいF,C,Dが共通なくらい。

ゾーン部 2進数 意味 用途
F 1111 数字(0〜9) Zoned Decimal の通常の数字(F0〜F9)
C 1100 大文字 A〜I、正の符号 最終桁の Cn は “正” を表す
D 1101 大文字 J〜R、負の符号 最終桁の Dn は “負” を表す
E 1110 大文字 S〜Z アルファベット後半
8 1000 小文字 a〜i 小文字前半
9 1001 小文字 j〜r 小文字中盤
A 1010 小文字 s〜z 小文字後半
B 1011 記号類 記号・特殊文字
7 0111 記号類 $, # など
0〜6 0000〜0110 制御コード NUL, BEL, CR など

EBCDICも一部配置が異なる数種類が存在する。以下はカナ拡張 CP290。

上位桁
0 1 2 3 4 5 6 7 8 9 A B C D E F
下位桁 0 NUL DLE DS SP & - [ ] ソ ~ { } $ 0
1 SOH DC1 SOS / i ¯ A J 1
2 STX DC2 FS SYN a j B K S 2
3 ETX DC3 WUS IR b k t C L T 3
4 SEL RES/ENP BYP/INP PP c l u D M U 4
5 HT NL LF TRN d m v E N V 5
6 RNL BS ETB NBS e n w F O W 6
7 DEL POC ESC EOT f o x G P X 7
8 GE CAN SA SBS g p y H Q Y 8
9 SPS EM SFE IT h ` z I R Z 9
A RPT UBS SM/SW RFF ! :
B VT CU1 CSP CU3 . , # q r s
C FF IFS MFA DC4 < % @
D CR IGS ENQ NAK ( ) _ '
E SO/LS1 IRS ACK + ; > =
F SI/LS0 IUS/ITB BEL SUB ? EO