BCD Encoding |
Top Previous Next |
BCD Encoding (Binary-Coded Decimal) was originally created to circumvent limitations regarding the maximum number of digits that can be represented in traditional formats for storing values. Formats such as the representation of real numbers in floating point are usually acceptable for math and scientific calculations. However, rounding errors caused by numbers that cannot be represented due to overflow or underflow problems may not be acceptable in certain applications, such as financial procedures. To overcome that limitation, a BCD encoding was developed to allow representing numbers up to the last digit. In this representation, each decimal digit is represented only in a binary format, without limitations regarding its number of digits. The next table shows decimal digits and their corresponding values in BCD (values in binary). Decimal digits in BCD encoding
To improve efficiency of this encoding, it is common to represent two digits per byte. Notice that, on the previous table, each decimal digit requires only four bits, or a half byte, for its representation. Such representation with two digits in each byte is called Packed BCD, and this the representation used by this Driver, that is, packets sent by this Driver with BCD values use a data byte for every two digits of the represented decimal value. That is why the Size field, for BCD data types, must be defined as half the maximum number of digits represented in values that are read or written.
ExampleAs an example, suppose that users want to send the value 84 in decimal (0x54 in hexadecimal format), using a packed BCD encoding in one byte, the format used by this Driver. The first step is separate the two decimal digits that compose this value in its decimal representation: ·Digit 1: 8 ·Digit 2: 4
If users want to send this value to a device without a BCD encoding, then the value sent to the protocol is 84, which is represented in hexadecimal format by 0x54, or else 01010100b in binary format. By using a packed BCD format, however, users represent these two decimal digits separately in each half, or nibble, of the byte to send: ·BCD: 0x84 or 10000100b
Notice that, if this value 0x84 is mistakenly interpreted in BCD format as a value in hexadecimal format without this encoding, and this value is then converted to decimal, users get the value 132, which is meaningless. The next table presents a few more examples of decimal values between 0 (zero) and 99 and their respective representations in Packed BCD format in one byte, presented in hexadecimal and binary formats. Decimal digits in Packed BCD encoding
|