Как битовое поле работает с типами символов? - PullRequest
5 голосов
/ 19 октября 2010
   struct stats
   {
       char top         : 1; 
       char bottom      : 1;
       char side        : 2;
   } MyStat;  

Я видел этот формат с целыми числами, но как работает вышеприведенное поле битов и что оно представляет?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 19 октября 2010

Поля символьных битов работают так же, как и int, только базовый тип имеет ширину 8 бит, а не 32 бит. Таким образом, вы получите struct stats, которая имеет размер 1 байт и 3 переменные-члены, занимающие всего 4 бита.

5 голосов
/ 19 октября 2010

Битовые поля должны быть объявлены с типом signed int, unsigned int или bool с <stdbool.h>.Другие типы могут или не могут быть законными (в зависимости от платформы), но будьте осторожны в отношении подписи - обычный int может быть принят как неподписанный для битового поля.

Тем не менее, это может быть подсказкакомпилятору, что выравнивание struct должно быть 1, а не sizeof(int).И компилятору разрешено принимать char и присваивать ему такое значение.

Согласно C99 6.7.2.1/9,

Битовое поле интерпретируется как подписанный илицелочисленный тип без знака, состоящий из указанного количества бит.Если значение 0 или 1 сохраняется в битовом поле ненулевой ширины типа _Bool, значение битового поля должно сравниваться равным сохраненному значению.

и сноске:

Как указано в 6.7.2 выше, если фактический используемый спецификатор типа равен int или typedef-name определен как int, то это определяется реализацией, является ли битовое поле подписанным илибез знака.

2 голосов
/ 19 октября 2010

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

char
int

Это не поддерживается стандартом (обычно используется unsigned int), но это хорошая попытка:)

re: ваш запрос, это попытка разработчика использовать меньше памяти для своих битовых полей (символ в отличие от unsigned int)

Кроме того, из Atmel мы получаем:

в Стандарте C, только «unsigned (int)» и «int» являются приемлемыми типами данных для элемента битового поля.Некоторые компиляторы допускают «unsigned char» ........

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...