Недостатки манипулирования битовым полем - PullRequest
0 голосов
/ 12 сентября 2011

Я читал эту ссылку

http://dec.bournemouth.ac.uk/staff/awatson/micro/articles/9907feat2.htm

Я не мог понять это следующие утверждения по ссылке, Пожалуйста, помогите мне понять об этом.

Программист просто пишет некоторые макросы, которые сдвигают или маскируют соответствующие биты, чтобы получить то, что нужно. Однако, если данные включают более длинные двоичные записи, C API сталкивается с проблемой. Я имею, за эти годы было замечено много длинных, сложных двоичных записей с короткими или длинными целочисленными средствами определения битового поля. С ограничивает эти битовые поля подполями целочисленных переменных, что подразумевает два ограничения: во-первых, что битовые поля могут быть нет шире, в битах, чем базовая переменная; а во-вторых, что нет битовое поле должно перекрывать нижележащие границы переменных. Сложный записи обычно состоят из нескольких смежных длинных целых заполнены определениями битовых подполей.

ANSI-совместимые компиляторы могут навязывать эти размеры и выравнивание ограничения и указать, в зависимости от реализации, но предсказуемым образом, как битовые поля упакованы в базовую машину структура слова. Выравнивание структуры памяти часто не переносимо, но память битового поля еще меньше.

Что я понял из этих утверждений, так это то, что макросы можно использовать для маскировки битов влево или вправо. Но у меня было это сомнение, почему они используют макросы? - Я подумал, что, определяя его в макросах, переносимость может быть установлена ​​независимо от 16-битной или 32-битной ОС. Правда ли это? Я не мог понять два недостатка, упомянутых в приведенном выше утверждении. 2. Битовое поле не должно перекрывать границы основных переменных

и строка

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

1 Ответ

4 голосов
/ 12 сентября 2011

1.битные поля могут быть не шире

Допустим, вам нужно битовое поле длиной 200 бит.

struct my_struct {
  int my_field:200;  /* Illegal! No integer type has 200 bits --> compile error!
} v;

2.Битовое поле не должно перекрывать границы базовой переменной

Допустим, вам нужны два 30-битных битовых поля и что компилятор использует 32-битное целое число в качестве базовой переменной.

struct my_struct {
  unsigned int my_field1:30;  
  unsigned int my_field2:30; /* Without padding this field will overlap a 32-bit boundary */
} v;

Обычно компилятор автоматически добавляет отступы, генерируя структуру со следующим макетом:

struct my_struct {
  unsigned int my_field1:30;  
  :2  /* padding added by the compiler */
  unsigned int my_field2:30; /* Without padding this field will overlap a 32-bit boundary */
  :2  /* padding added by the compiler */
} v;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...