Глава 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 "Перегрузка операций").
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 }