Основной вопрос относительно структур - PullRequest
1 голос
/ 22 февраля 2011

Я иду через драйвер устройства Windows, и я увидел структурный код, подобный этому:

struct driver1
{
       UINT64 Readable     : 1; 
       UINT64 Writable     : 1; 
       UINT64 Executable   : 1; 
       UINT64 Control      : 3; 
       UINT64 Status       : 1; 
       UINT64 Reserved     : 51; 
       UINT64 Available1   : 5; 
       UINT64 IsMapped     : 1;
};

Каждый UINT64 представляет один бит? Представляет ли двоеточие биты?

Ответы [ 3 ]

3 голосов
/ 22 февраля 2011

Это идея, да.Это называется битфилдом.Число указывает количество бит, которые кодер запрашивает, чтобы это поле заняло.Если вы подсчитаете их все, вы увидите, что они суммируют до 64.

Проблема в том, что C ++ (в отличие от Ada) не дает реального способа гарантировать, что вся структура занимает только 64 бита.Так что, если вы компилируете это в системе, отличной от той, для которой она была разработана, я бы обязательно это проверил.

Когда я пишу драйверы устройств в C ++, я не использую битовые поля,Вместо этого я использую битовые маски.Конечно, проблема в том, что вы должны знать, как ваша платформа упорядочивает свои байты.

3 голосов
/ 22 февраля 2011

Это означает, что Readable, Writable и Executable каждый занимает немного, Control занимает 3, Reserved 51 и т. Д.

Подробнее см. http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html.

UINT64 просто означает, что все битовое поле будет внутри 64-разрядного целого числа без знака.

1 голос
/ 22 февраля 2011

Это битовые поля в C , поэтому вы можете получить доступ к этим битам независимо через структуру.

...