Что означает двоеточие в объявлении структуры, например :1, :7 , :16 или : 32?

StackOverflow https://stackoverflow.com/questions/1604968

  •  05-07-2019
  •  | 
  •  

Вопрос

Что означает следующий код на C ++?

unsigned char a : 1; 
unsigned char b : 7;

Я предполагаю, что это создает два символа a и b, и оба они должны быть длиной в один байт, но я понятия не имею, что такое ":1" и ":7" часть делает.

Это было полезно?

Решение

1 и 7 - это разрядные значения, ограничивающие диапазон значений.Обычно они встречаются в структурах и профсоюзах.Например, в некоторых системах (зависит от char правила ширины и упаковки и т.д.), код:

typedef struct {
    unsigned char a : 1;
    unsigned char b : 7;
} tOneAndSevenBits;

создает 8-битное значение, один бит для a и 7 бит для b.

Обычно используется в C для доступа к "сжатым" значениям, таким как 4-битный nybble, который может содержаться в верхней половине 8-битного символа:

typedef struct {
    unsigned char leftFour  : 4;
    unsigned char rightFour : 4;
} tTwoNybbles;

Для специалистов в области языка среди нас раздел 9.6 стандарта C ++ 11 объясняет это подробно, слегка перефразировав:


Битовые поля [class.bit]

Член-декларант формы

     идентификаторвыбрать   атрибут-спецификаторвыбрать   :   постоянное выражение

задает битовое поле;его длина отделяется от имени битового поля двоеточием.Необязательный атрибут-спецификатор относится к объявляемому объекту.Атрибут битового поля не является частью типа члена класса.

Тот Самый постоянное выражение должно быть целочисленным постоянным выражением со значением, большим или равным нулю.Значение выражения целочисленной константы может быть больше, чем количество битов в объектном представлении типа битового поля;в таких случаях дополнительные биты используются в качестве битов заполнения и не участвуют в представлении значения битового поля.

Распределение битовых полей внутри объекта класса определяется реализацией.Выравнивание битовых полей определяется реализацией.Битовые поля упаковываются в некоторую адресуемую единицу выделения.

Примечание: битовые поля распределяются между единицами выделения на одних машинах, а не на других.Битовые поля назначаются справа налево на одних машинах, слева направо - на других.- конечная нота

Другие советы

Я считаю, что это будут битовые поля.

Строго говоря, битовое поле должно быть int, unsigned int или _Bool. Хотя большинство компиляторов будут принимать любые целочисленные типы.

Ссылка C11 6.7.2.1:

  

Битовое поле должно иметь тип, который является квалифицированным или неквалифицированным   версия _Bool, подписанный int, unsigned int или какой-либо другой   определенный реализацией тип.

Ваш компилятор, вероятно, выделит 1 байт памяти, но он может получить больше.

Ссылка C11 6.7.2.1:

  

Реализация может выделять любую адресуемую единицу памяти большой   достаточно, чтобы держать битовое поле.

Экономия достигается, когда у вас есть несколько битовых полей, которые объявляются одно за другим. В этом случае выделенное хранилище будет упаковано, если это возможно.

Ссылка C11 6.7.2.1:

  

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top