Symbol Code16 Code10 Code2

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 размещаются три бита, не доступных для использования. Они используются для выравнивания полей по плану программиста.

Заметим в заключение, что любой код, использующий поля битов, зависит от компьютера.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: