a 61 97 01100001
A 41 65 01000001
2 32 50 00110010
00 0 00000000
; 3b 59 00111011
Две строки получили, если при вводе нажали на клавишу “F1”
; 3b 59 00111011
Получили при вводе символа ‘;’
00 0 00000000
H 48 72 01001000
Две строки получили, если при вводе нажали на клавишу “стрелка вверх”
00 0 00000000
R 52 82 01010010
Две строки получили, если при вводе нажали на клавишу “ Insert”
R 52 82 01010010
Получили при вводе символа ‘R’.
Здесь один байт обозначается следующим образом:
|- --------------------------------- N.ch --------------------|
|- --- N.num16.n2---------|-- ---N.num16.n1-----------|
Кроме этого, “левый крайний” бит обозначается N.MyB.b8, следующий бит — N.MyB.b7 и т.д. Доступ к младшему “правому” биту осуществляется с помощью N.MyB.b1. Так как поля битов n1 и n2 объединены в структуру, которая входит в объединение, то эти поля занимают разные биты в указанном выше порядке.
Пример 2.б. Изменим объявление объединения. Включим в него поля битов n1 и n2 напрямую, то есть объявим объединение так:
union TUI
{ TMyByte MyB;
unsigned n1:4; unsigned n2:4;
char ch;
} N;
Тогда поля n1 и n2 будут занимать одни и те же “крайние правые” четыре бита. Так как структуры num16 в этом варианте нет, то доступ к таким полям осуществляется так:
|
|
cout<<" "<< hex<<N.n2<<N.n1;
printf(" %d ", N.n2*16+N.n1);
Но эти операторы выведут неправильный результат. Например, для символа A вместо 41 и 65 будет выведено 11 и 17, так как доступ к шестнадцатеричной цифре 4 мы потеряли, а цифра 1 будет храниться и в поле n1, и в поле n2. Двоичное представление кода будет по- прежнему выводиться правильно.
Битовые поля имеют ряд ограничений и особенностей.
Нельзя получить адрес битового поля. Это объясняется тем, что адрес — это номер байта, а не бита, и битовые поля размещаются не с самого начала байта. Поэтому для них не определена операция “взятие адреса” (&). По этой же причине нет указателей и ссылок на битовые поля. Нельзя возвратить их из функции. Поля битов не могут объединяться в массивы.
Можно объявить поле битов без указания его идентификатора. Например,
{ struct {
unsigned a:5;
unsigned:3;
unsigned y:1;
} S2;
В структуре S2 между полями a и y размещаются три бита, не доступных для использования. Они используются для выравнивания полей по плану программиста.
Заметим в заключение, что любой код, использующий поля битов, зависит от компьютера.