В битовом поле, почему некоторые биты пусты в середине? - PullRequest
6 голосов
/ 17 июня 2019

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

struct product {
    unsigned int code : 6;    // product code : 6 bit
    unsigned int : 10;    // not use 10 bit
    unsigned int color : 5;    // product color : 5 bit
    unsigned int : 5;    // not use 5 bit
    unsigned int size : 6;    // product size : 3 bit
};

Я не знаю, почему я не использую бит в середине

Ответы [ 3 ]

5 голосов
/ 17 июня 2019

Битовые поля структурированы так, чтобы избежать пересечения границ слов и байтов.Первые два, 6 и 10 битов добавляют до 16 битов, в то время как остальные три, 5 и 5 и 6 также складываются до 16 битов.Может быть очень неэффективно иметь битовое поле в составе 2 отдельных 16-битных слов.

2 голосов
/ 17 июня 2019

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

enter image description here

Безымянные битовые поля избавляют нас от наличия полей с reserved1, reserved2, ... names

2 голосов
/ 17 июня 2019

Это безымянное битовое поле, в основном используемое битовое заполнение. От C17 6.7.2.1:

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

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

Но также обратите внимание, что неясно определено, какой бит является MSB, и что компилятор может свободно добавлять собственное заполнение, поэтому это битовое поле не переносимо между компиляторами или системами. Лучше всего избегать битовых полей целиком.

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