Двійково-десятковий код
Двійко́во-десятко́вий код (ДДК, англ. BCD, binary-coded decimal) — спосіб представлення десяткового числа, у якому кожній цифрі відповідає певна послідовність двійкових розрядів. Цей код (а точніше, його різновид 8421-ДДК) спрощує ввід/вивід числа у десятковому вигляді, використовується у калькуляторах та при роботі над числами з нерухомою комою (наприклад, з грішми) для забезпечення належної точності підрахунків. Реалізація BCD-арифметики досить проста, тому вона присутня у наборах інструкцій майже всіх мікропроцесорів та мікроконтролерів.
Найпростішим варіантом є 8421-ДДК, який означає, що кожна цифра десяткового числа записується своїм двійковим представленням з доповненням нулями до 4 розрядів (тетрада). Наприклад, число 309110, при кодуванні у 8421-ДДК буде виглядати як 0011 0000 1001 0001 2
Оскільки всього існує 10 десяткових цифр, а одна тетрада (4 біти) може визначати 24 = 16 різних комбінацій, то очевидно, що існує більше ніж один можливий варіант побудови ДДК. Кількість можливих комбінацій дорівнює . Більшість цих можливих комбінацій подібні, тому для стандартизації був вибраний спеціальний алгоритм генерації ДДК.
Кожному розряду ДДК ставиться якась фіксована вага. Умови побудови коду:
- Ваги розрядів розміщуються у порядку зростання (від молодшого розряду до старшого)
- Вага найменшого розряду q0 дорівнює 1
- Вага наступного розряду q1 дорівнює 1 або 2
- Ваги інших 2 розрядів підбираються так, щоб їхня сума була більша або рівна 6 (якщо q1 = 2) або 7 (якщо q1 = 1)
- q3 <= q2 + q1 + q0 + 1
За такими правилами можлива побудова 17 різних кодів: 8-4-2-1, 7-4-2-1, 6-4-2-1, 5-4-2-1, 4-4-2-1, 7-3-2-1, 6-3-2-1, 5-3-2-1, 4-3-2-1, 3-3-2-1, 6-2-2-1, 5-2-2-1, 4-2-2-1, 6-3-1-1, 5-3-1-1, 4-3-1-1, 5-2-1-1
Для перетворення десяткової цифри у ДДК потрібно визначити, ваги яких розрядів утворюють у сумі дану цифру і поставити на їх місце одинички, а інші розряди заповнити нулями. Так, при кодуванні цифри 5 за допомогою 5221-ДДК видно, що q3 = 5, а отже 510 = 10005221-ДДК. Разом з тим, у даного коду є неоднозначність кодування, абсолютно коректним кодуванням буде 510 = 01115221-ДДК, оскільки q2 + q1 + q0 = 5. Неоднозначність кодування присутня у всіх кодах окрім 8421-ДДК.
Декодування тетради ДДК відбувається як сумування ваг розрядів, навпроти яких записана 1 у двійковому представлені. Наприклад, 10106321-ДДК = 6·1 + 3·0 + 2·1 + 1·0 = 6 + 2 = 810. На відміну від кодування, декодування завжди однозначне.
Якщо у ДДК q3 + q2 + q1 + q0 > 9, то це означає, що код містить заборонені комбінації (ті, що декодуються у числа більші за 9, тобто, не у цифру). Деякі системи використовують заборонені комбінації для представлення знаку, десяткової крапки тощо.
BCD, який являє собою 8421-ДДК, виділяється серед інших двійково-десяткових кодів кількома особливостями:
- Ваги розрядів коду являють собою степені двійки, а отже кодування цифри зводиться до простого переведення у двійкову систему, що є досить відомою операцією
- Однозначне кодування — не може бути 2 тетрад, які будуть позначати одну цифру
- 6 заборонених комбінацій — їх можна використати для позначення знаку, десяткової крапки, експоненти тощо.
Через ці особливості (а точніше, через першу) даний ДДК зручно використовувати для збереження десяткових чисел у комп'ютерах. До переваг можна віднести елементарність операції округлення, елементарність множення на 10.
Оскільки мінімальною одиницею даних у процесорах як правило є байт, а не тетрада, то це призвело до появи двох форматів зберігання BCD в пам'яті. Неупакований формат зберігає кодовану цифру у молодшій тетраді байта, а старшу обнуляє. Упакований записує молодшу цифру у молодшу тетраду, а старшу — у старшу тетраду. Тому у неупакованому форматі один байт може містити числа від 0 до 9, а в упакованому — числа від 0 до 99. Неупакований формат зручний для перетворення цифри у ASCII-символ і округлення, а упакований — для арифметичних операцій і компактності даних. Процесори, які підтримують обидва формати, можуть містити також команди для переводу з одного формату в інший.
Для процесорів, які націлені на двійкові арифметичні операції, виконання двійково-десяткових операцій не є складним, проте створює незручності для програміста. Це пов'язано з існуванням заборонених комбінацій. В даному прикладі показано, що в деяких випадках над упакованими BCD числами можна виконувати звичайні бінарні операції
0001 0001 + 0000 0110 = 0001 0111 1 1 + 0 6 = 1 7
Проте, якщо сума розрядів виявиться більшою за 9, то результат стане некоректним:
0001 1001 + 0000 0110 = 0001 1111 1 9 + 0 6 = 1 ####
Комбінація 1111 у 8421-ДДК є забороненою, тому результат виявився неправильним. Для розв'язання даної проблеми потрібно виконати десяткову корекцію числа після виконання арифметичної операції. Суть десяткової корекції у тому, що якщо у тетраді утворилась заборонена комбінація або відбувся перенос біта з 3 у 4 розряди (рахуючи від нульового), то до відповідної тетради результату додається число 610 або 01102:
0001 1001 + 0000 0110 = 0001 1111 1 9 + 0 6 = 1 #### + 0000 0110 --------- 0010 0101 2 5
0101 1001 + 0111 1001 = 1101 0010 5 9 + 7 9 = заборонена комб. був перенос біта + 0110 0110 ----------------------- (1) 0011 1000 3 8
Наявність біту переповнення після виконання операції означає, що відбувся перенос у розряд сотень. За рахунок даної особливості у деяких операціях діапазон двійково-десяткових чисел, які кодуються одним байтом, розширений від 0 до 199. У цьому випадку результат дорівнює (1) 38, тобто, число 138.
- Двійково-десяткові коди (ДДК) [Архівовано 20 вересня 2011 у Wayback Machine.]
- В. И. Юров. Assembler. — 2-е изд. — Санкт-Петербург : Питер, 2003. — 637 с. — ISBN 5-94723-581-1.(рос.)