Глава 8. Раскрытие выражений_________________________________785

Вместо этого можно так изменить описание типа BCD, чтобы он представлял из себя объединение одного символьного и двух 4-х битных полей:

union BCD {

char char_bcd;

struct{ int lower: 4; int upper: 4; } bed; // как битовые поля

operator int()( return bed.upper * 10 + bed.lower; }

Замечание

Представление чисел в формате BCD не ставило себе целью борьбу за свободное место. В таком виде в один байт можно записать числа от 0 до 99, тогда как обычно туда можно записывать числа от 0 до 255. Тем не менее, если сравнить числа в формате BCD-c символьной строкой, то первые выигрывают по компактности в соотношении 2 к 1: если в 1-м байте можно хранить информацию об 1 символе, то в числе формата BCD уже о 2-х.

*

Получение значения сильно упрощается при использовании объединения BCD, которое соединяет в себе символьный тип и битовые поля. Для полноты можно написать операцию преобразования, неявно выполняющуюся, когда контекст подразумевает целые числа, (см. главу 16 "Перегрузка операций").

h01851.jpg

1 // BCD.CPP — Пример неявного преобразования типа.

2 ^include <iostream.h>

3 // Двоично-десятичное число

4 typedef union BCD

5 ( char packed_bcd;

6 struct {

7 unsigned int lower: 4;

8 unsigned int upper: 4;

9 } bed;

10 int BcdToInt()( return bed.upper * 10 + bed.lower; }

11 operator int()( return BcdToIntO; }

12 BCD( char c) : packed_bcd( c)(}; // конструктор

13 ) BCD_NUMBER;

14 void main()

15 {

16 char asBcd = 0х23; // Это не 2 * 16 + 3 = 35, это BCD

17 int asNum = ((asBcd & OxFO) » 4) * 10 + (asBcd & OxOF);

18 cout « "Некрасивое преобразование: " « asNum « endl;

19 BCD_NUMBER bed = asBcd;

20 cout « "Неявное преобразование: " « bed « endl;

21 }