In computing and electronic systems, binarycoded decimal (BCD) (sometimes called natural binarycoded decimal, NBCD) is an encoding for decimal numbers in which each digit is represented by its own binary sequence. Its main virtue is that it allows easy conversion to decimal digits for printing or display, and allows faster decimal calculations. Its drawbacks are a small increase in the complexity of circuits needed to implement mathematical operations. Uncompressed BCD is also a relatively inefficient encoding—it occupies more space than a purely binary representation.
In BCD, a digit is usually represented by four bits which, in general, represent the decimal digits 0 through 9. Other bit combinations are sometimes used for a sign or for other indications (e.g., error or overflow).
Although uncompressed BCD is not as widely used as it once was, decimal fixedpoint and floatingpoint are still important and continue to be used in financial, commercial, and industrial computing.^{[1]}
Recent decimal floatingpoint representations use base10 exponents, but not BCD encodings. Current hardware implementations, however, convert the compressed decimal encodings to BCD internally before carrying out computations. Software implementations of decimal arithmetic typically use BCD or some other 10^{n} base, depending on the operation.
To encode a decimal number using the common BCD encoding, each decimal digit is stored in a 4bit nibble:
Decimal: 0 1 2 3 4 5 6 7 8 9 BCD: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
Thus, the BCD encoding for the number 127 would be:
0001 0010 0111
Whereas the pure binary number would be:
0111 1111
Since most computers store data in 8bit bytes, there are two common ways of storing 4bit BCD digits in those bytes:
Unlike binaryencoded numbers, BCDencoded numbers can easily be displayed by mapping each of the nibbles to a different character. Converting a binaryencoded number to decimal for display is much harder, as this generally involves integer multiplication or divide operations. BCD also avoids problems where fractions that can be represented exactly in decimal cannot be represented in binary (e.g., onetenth).
BCD is very common in electronic systems where a numeric value is to be displayed, especially in systems consisting solely of digital logic, and not containing a microprocessor. By utilizing BCD, the manipulation of numerical data for display can be greatly simplified by treating each digit as a separate single subcircuit. This matches much more closely the physical reality of display hardware—a designer might choose to use a series of separate identical sevensegment displays to build a metering circuit, for example. If the numeric quantity were stored and manipulated as pure binary, interfacing to such a display would require complex circuitry. Therefore, in cases where the calculations are relatively simple working throughout with BCD can lead to a simpler overall system than converting to binary.
The same argument applies when hardware of this type uses an embedded microcontroller or other small processor. Often, smaller code results when representing numbers internally in BCD format, since a conversion from or to binary representation can be expensive on such limited processors. For these applications, some small processors feature BCD arithmetic modes, which assist when writing routines that manipulate BCD quantities.
A widely used^{[citation needed]} variation of the twodigitsperbyte encoding is called packed BCD (or simply packed decimal). All of the upper bytes of a multibyte word plus the upper four bits (nibble) of the lowest byte are used to store decimal integers. The lower four bits of the lowest byte are used as the sign flag^{[citation needed]}. As an example, a 32bit word contains 4 bytes or 8 nibbles. Packed BCD uses the upper 7 nibbles to store the integers of a 7digit decimal value and uses the lowest nibble to indicate the sign of those integers.
Standard sign values are 1100 (hex C) for positive (+) and 1101 (D) for negative (−). This convention was derived from abbreviations for accounting terms (Credit and Debit), as packed decimal coding was widely used in accounting systems.^{[citation needed]} Other allowed signs are 1010 (A) and 1110 (E) for positive and 1011 (B) for negative. Some implementations also provide unsigned BCD values with a sign nibble of 1111 (F)^{[citation needed]}. In packed BCD, the number 127 is represented by 0001 0010 0111 1100 (127C) and −127 is represented by 0001 0010 0111 1101 (127D).
Sign Digit 
BCD 8 4 2 1 
Sign  Notes 

A  1 0 1 0  +  
B  1 0 1 1  −  
C  1 1 0 0  +  Preferred 
D  1 1 0 1  −  Preferred 
E  1 1 1 0  +  
F  1 1 1 1  +  Unsigned 
No matter how many bytes wide a word is, there are always an even number of nibbles because each byte has two of them. Therefore, a word of n bytes can contain up to (2n)−1 decimal digits, which is always an odd number of digits. A decimal number with d digits requires ½(d+1) bytes of storage space.
For example, a 4byte (32bit) word can hold seven decimal digits plus a sign, and can represent values ranging from ±9,999,999. Thus the number −1,234,567 is 7 digits wide and is encoded as:
0001 0010 0011 0100 0101 0110 0111 1101 1 2 3 4 5 6 7 −
(Note that, like character strings, the first byte of the packed decimal — with the most significant two digits — is usually stored in the lowest address in memory, independent of the endianness of the machine).
In contrast, a 4byte binary two's complement integer can represent values from −2,147,483,648 to +2,147,483,647.
While packed BCD does not make optimal use of storage (about ^{1}/_{6} of the memory used is wasted), conversion to ASCII, EBCDIC, or the various encodings of Unicode is still trivial, as no arithmetic operations are required. The extra storage requirements are usually offset by the need for the accuracy that fixedpoint decimal arithmetic provides. Denser packings of BCD exist which avoid the storage penalty and also need no arithmetic operations for common conversions.
Fixedpoint decimal numbers are supported by some programming languages (such as COBOL and PL/I), and provide an implicit decimal point in front of one of the digits. For example, a packed decimal value encoded with the bytes 12 34 56 7C represents the fixedpoint value +1,234.567 when the implied decimal point is located between the 4th and 5th digits:
12 34 56 7C 12 34.56 7+
If a decimal digit requires four bits, then three decimal digits require 12 bits. However, since 2^{10} (1,024) is greater than 10^{3} (1,000), if three decimal digits are encoded together, only 10 bits are needed. Two such encodings are ChenHo encoding and Densely Packed Decimal. The latter has the advantage that subsets of the encoding encode two digits in the optimal seven bits and one digit in four bits, as in regular BCD.
Some implementations, for example IBM mainframe systems, support zoned decimal numeric representations. Each decimal digit is stored in one byte, with the lower four bits encoding the digit in BCD form. The upper four bits, called the "zone" bits, are usually set to a fixed value so that the byte holds a character value corresponding to the digit. EBCDIC systems use a zone value of 1111 (hex F); this yields bytes in the range F0 to F9 (hex), which are the EBCDIC codes for the characters "0" through "9". Similarly, ASCII systems use a zone value of 0011 (hex 3), giving character codes 30 to 39 (hex).
For signed zoned decimal values, the rightmost (least significant) zone nibble holds the sign digit, which is the same set of values that are used for signed packed decimal numbers (see above). Thus a zoned decimal value encoded as the hex bytes F1 F2 D3 represents the signed decimal value −123:
F1 F2 D3 1 2 −3
BCD Digit  EBCDIC Character  Hexadecimal  

0+ 
{ (*) 
\ (*) 
C0 
A0 
E0 

1+ 
A 
~ (*) 
C1 
A1 
E1 

2+ 
B 
s 
S 
C2 
A2 
E2 
3+ 
C 
t 
T 
C3 
A3 
E3 
4+ 
D 
u 
U 
C4 
A4 
E4 
5+ 
E 
v 
V 
C5 
A5 
E5 
6+ 
F 
w 
W 
C6 
A6 
E6 
7+ 
G 
x 
X 
C7 
A7 
E7 
8+ 
H 
y 
Y 
C8 
A8 
E8 
9+ 
I 
z 
Z 
C9 
A9 
E9 
0− 
} (*) 
^ (*) 
D0 
B0 

1− 
J 
D1 
B1 

2− 
K 
D2 
B2 

3− 
L 
D3 
B3 

4− 
M 
D4 
B4 

5− 
N 
D5 
B5 

6− 
O 
D6 
B6 

7− 
P 
D7 
B7 

8− 
Q 
D8 
B8 

9− 
R 
D9 
B9 
(*) Note: These characters vary depending on the local character code page.
Some languages (such as COBOL and PL/I) directly support fixedpoint zoned decimal values, assigning an implicit decimal point at some location between the decimal digits of a number. For example, given a sixbyte signed zoned decimal value with an implied decimal point to the right of the fourth digit, the hex bytes F1 F2 F7 F9 F5 C0 represent the value +1,279.50:
F1 F2 F7 F9 F5 C0 1 2 7 9. 5 +0
IBM used the terms binarycoded decimal and BCD for 6bit alphameric codes that represented numbers, uppercase letters and special characters. Some variation of BCD alphamerics was used in most early IBM computers, including the IBM 1620, IBM 1400 series, and nonDecimal Architecture members of the IBM 700/7000 series.
The IBM 1400 series were characteraddressable machines, each location being six bits labeled B, A, 8, 4, 2 and 1, plus an odd parity check bit (C) and a word mark bit (M). For encoding digits 1 through 9, B and A were zero and the digit value represented by standard 4bit BCD in bits 8 through 1. For most other characters bits B and A were derived simply from the "12", "11", and "0" "zone punches" in the punched card character code, and bits 8 through 1 from the 1 through 9 punches. A "12 zone" punch set both B and A, an "11 zone" set B, and a "0 zone" (a 0 punch combined with any others) set A. Thus the letter A, (12,1) in the punched card format, was encoded (B,A,1) and the currency symbol $, (11,8,3) in the punched card, as (B,8,3). This allowed the circuitry to convert between the punched card format and the internal storage format to be very simple with only a few special cases. One important special case was digit 0, represented by a lone 0 punch in the card, and (8,2) in core memory. ^{[2]}
The memory of the IBM 1620 was organized into 5bit addressable digits, the usual 8, 4, 2, 1 plus F, used as a flag bit. BCD alphamerics were encoded using digit pairs, with the "zone" in the evenaddressed digit and the "digit" in the oddaddressed digit, the "zone" being related to the 12, 11, and 0 "zone punches" as in the 1400 series. Input/Output translation hardware converted between the internal digit pairs and the external standard 6bit BCD codes.
In the Decimal Architecture IBM 7070, IBM 7072, and IBM 7074 alphamerics were encoded using digit pairs (using twooutoffive code in the digits, not BCD) of the 10digit word, with the "zone" in the left digit and the "digit" in the right digit. Input/Output translation hardware converted between the internal digit pairs and the external standard 6bit BCD codes.
With the introduction of System/360, IBM expanded 6bit BCD alphamerics to 8bit EBCDIC, allowing the addition of many more characters (e.g., lowercase letters). A variable length Packed BCD numeric data type was also implemented.
Today, BCD data is still heavily used in IBM processors and databases, such as IBM DB2, mainframes, and Power6. In these products, the BCD is usually zoned BCD (as in EBCDIC or ASCII), Packed BCD (two decimal digits per byte), or "pure" BCD encoding (one decimal digit stored as BCD in the low four bits of each byte). All of these are used within hardware registers and processing units, and in software.
Other computers such as the Digital Equipment Corporation VAX11 series could also use BCD for numeric data and could perform arithmetic directly on packed BCD data. The MicroVAX and later VAX implementations dropped this ability from the CPU but retained code compatibility with earlier machines by implementing the missing instructions in an operating systemsupplied software library. In more recent computers such capabilities are almost always implemented in software rather than the CPU's instruction set, but BCD numeric data is still extremely common in commercial and financial applications.
It is possible to perform addition in BCD by first adding in binary, and then converting to BCD afterwards. Conversion of the simple sum of two digits can be done by adding 6 (that is, 16 – 10) when the result has a value greater than 9. For example:
1001 + 1000 = 10001 = 0001 0001 9 + 8 = 17 = 1 1
In BCD, there cannot exist a value greater than 9 (1001) per nibble. To correct this, 6 (0110) is added to that sum to get the correct first two digits:
0001 0001 + 0000 0110 = 0001 0111 1 1 + 0 6 = 1 7
which gives two nibbles, 0001 and 0111, which correspond to the digits "1" and "7". This yields "17" in BCD, which is the correct result. This technique can be extended to adding multiple digits, by adding in groups from right to left, propagating the second digit as a carry, always comparing the 5bit result of each digitpair sum to 9.
Subtraction is done by adding the ten's complement of the subtrahend. To represent the sign of a number in BCD, the number 0000 is used to represent a positive number, and 1001 is used to represent a negative number. The remaining 14 combinations are invalid signs. To illustrate signed BCD subtraction, consider the following problem: 357  432.
In signed BCD, 357 is 0000 0011 0101 0111. The ten's complement of 432 can be obtained by taking the nine's complement of 432, and then adding one. So, 999  432 = 567, and 567 + 1 = 568. By preceding 568 in BCD by the negative sign code, the number 432 can be represented. So, 432 in signed BCD is 1001 0101 0110 1000.
Now that both numbers are represented in signed BCD, they can be added together:
0000 0011 0101 0111 + 1001 0101 0110 1000 = 1001 1000 1011 1111 0 3 5 7 + 9 5 6 8 = 9 8 11 15
Since BCD is a form of decimal representation, several of the digit sums above are invalid. In the event that an invalid entry (any BCD digit greater than 1001) exists, 6 is added to generate a carry bit and cause the sum to become a valid entry. The reason for adding 6 is that there are 16 possible 4bit BCD values (since 2^{4} = 16), but only 10 values are valid (0000 through 1001). So adding 6 to the invalid entries results in the following:
1001 1000 1011 1111 + 0000 0000 0110 0110 = 1001 1001 0010 0101 9 8 11 15 0 0 6 6 9 9 2 5
Thus the result of the subtraction is 1001 1001 0010 0101 (925). To check the answer, note that the first bit is the sign bit, which is negative. This seems to be correct, since 357  432 should result in a negative number. To check the rest of the digits, represent them in decimal. 1001 0010 0101 is 925. The ten's complement of 925 is 1000  925 = 999  925 + 1 = 074 + 1 = 75, so the calculated answer is 75. To check, perform standard subtraction to verify that 357  432 is 75.
Note that in the event that there are a different number of nibbles being added together (such as 1053  122), the number with the fewest number of digits must first be padded with zeros before taking the ten's complement or subtracting. So, with 1053  122, 122 would have to first be represented as 0122, and the ten's complement of 0122 would have to be calculated.
The binarycoded decimal scheme described in this article is the most common encoding, but there are many others. The method here can be referred to as Simple BinaryCoded Decimal (SBCD) or BCD 8421. In the headers to the table, the '8 4 2 1', etc., indicates the weight of each bit shown; note that in the fifth column two of the weights are negative. Both ASCII and EBCDIC character codes for the digits are examples of zoned BCD, and are also shown in the table.
The following table represents decimal digits from 0 to 9 in various BCD systems:
Digit 
BCD 8 4 2 1 
Excess3 or Stibitz Code 
BCD 2 4 2 1 or Aiken Code 
BCD 8 4 −2 −1 
IBM 702 IBM 705 IBM 7080 IBM 1401 8 4 2 1 
ASCII 0000 8421 
EBCDIC 0000 8421 

0  0000  0011  0000  0000  1010  0011 0000  1111 0000 
1  0001  0100  0001  0111  0001  0011 0001  1111 0001 
2  0010  0101  0010  0110  0010  0011 0010  1111 0010 
3  0011  0110  0011  0101  0011  0011 0011  1111 0011 
4  0100  0111  0100  0100  0100  0011 0100  1111 0100 
5  0101  1000  1011  1011  0101  0011 0101  1111 0101 
6  0110  1001  1100  1010  0110  0011 0110  1111 0110 
7  0111  1010  1101  1001  0111  0011 0111  1111 0111 
8  1000  1011  1110  1000  1000  0011 1000  1111 1000 
9  1001  1100  1111  1111  1001  0011 1001  1111 1001 
In the 1972 case Gottschalk v. Benson, the U.S. Supreme Court overturned a lower court decision which had allowed a patent for converting BCD encoded numbers to binary on a computer. This was an important case in determining the patentability of software and algorithms.
The BIOS in many personal computers stores the date and time in BCD because the MC6818 realtime clock chip used in the original IBM PC AT motherboard provided the time encoded in BCD. This form is easily converted into ASCII for display.^{[3]}
The Atari 8bit family of computers used BCD to implement floatingpoint algorithms. The MOS 6502 processor used has a BCD mode that affects the addition and subtraction instructions.
Early models of the PlayStation 3 store the date and time in BCD. This led to a worldwide outage of the console on 1st march 2010. The last two digits of the year stored as BCD were misinterpreted as 16 causing a paradox in the unit's date, rendering most functionalities inoperable.
Various BCD implementations exist that employ other representations for numbers. Programmable calculators manufactured by Texas Instruments, HewlettPackard, and others typically employ a floatingpoint BCD format, typically with two or three digits for the (decimal) exponent. The extra bits of the sign digit may be used to indicate special numeric values, such as infinity, underflow/overflow, and error (a blinking display).
Signed decimal values may be represented in several ways. The COBOL programming language, for example, supports a total of five zoned decimal formats, each one encoding the numeric sign in a different way:
Type  Format  Example 

Unsigned  No sign nibble  F1 F2 F3 
Signed trailing (canonical format) 
Sign nibble in the last (least significant) byte  F1 F2 C3 
Signed leading  Sign nibble in the first (most significant) byte  C1 F2 F3 
Signed trailing separate  Separate sign character byte ('+' or '−' ) following the digit bytes 
F1 F2 F3 2B 
Signed leading separate  Separate sign character byte ('+' or '−' ) preceding the digit bytes 
2B F1 F2 F3 
If errors in representation and computation are more important than the speed of conversion to and from display, a scaled binary representation may be used, which stores a decimal number as a binaryencoded integer and a binaryencoded signed decimal exponent. For example, 0.2 can be represented as 2 × 10^{−1}.
This representation allows rapid multiplication and division, but may require shifting by a power of 10 during addition and subtraction to align the decimal points. It is appropriate for applications with a fixed number of decimal places that do not then require this adjustment— particularly financial applications where 2 or 4 digits after the decimal point are usually enough. Indeed this is almost a form of fixed point arithmetic since the position of the radix point is implied.
ChenHo encoding provides a boolean transformation for converting groups of three BCDencoded digits to and from 10bit values that can be efficiently encoded in hardware with only 2 or 3 gate delays. Densely Packed Decimal is a similar scheme that is used for most of the significand, except the lead digit, for one of the two alternative decimal encodings specified in the IEEE 7542008 standard.
