2009-06-17 3 views
4

Я всегда думал, что я знал, C очень хорошо, пока я не видел что-то подобное в другом посте:Вопрос о C построить

struct foo { 
    int x:1; 
}; 

Я действительно хотел бы знать цель из: 1. Может кто-нибудь подскажет мне? Благодарю.

ответ

11

bitfield. x имеет длину 1 бит.

Каждое поле доступ и манипулировать , как если бы он был обычным членом структуры. Ключевые слова, подписанные и unsigned, означают, что вы ожидаете, , за исключением того, что интересно отметить , что однобитовое поле со знаком на машине с дополнительным номером может принимать значения 0 или -1 только . В объявлениях указывается , которые разрешены для включения летучих отборочных команд const и .

Основное использование битовых полей является либо позволяют плотно упаковать данные или быть в состоянии указать поля внутри некоторых внешне произведенных файлов данных. C не дает никаких гарантий при заказе полей в машинных словах, поэтому если вы используете , воспользуйтесь ими по последней причине, вы не будете несовместимы с программой , тоже будет зависимой от компилятора. В стандарте указано, что поля упакованы в «единицы хранения», которые являются типично машинами. Заказ на упаковку , и может ли битпотол пересечь границу блока хранения, определены . Чтобы установить выравнивание на границу хранилища, , поле ширины нулевой точки используется до уровня , который вы хотите выровнять.

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

Бит-поля не имеют адресов - вы не можете иметь указатели на них или массивы из них.

http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html

+0

Спасибо! Но какое преимущество имеет это, просто объявляя это регулярным целым? –

+0

@Joe M: Он потенциально использует меньше места. Это более полезно, когда у вас есть несколько битполей, поскольку компилятор (надеюсь) использует меньше памяти для каждой структуры в этом случае, чем несколько int. –

+1

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

0

Этот синтаксис используется для обозначения битовых полей (т.е. полей битов, которые являются более узкими, чем сам тип данных), так что «х» в вашем примере действительно использует 1 бит в межд ,

Более полезным примером может быть что-то вроде

char x:4; 
char y:4; 

Это пакет два 4-битовых полей в один байт. Преимущество, конечно же, в экономии места в архитектуре, где каждый байт имеет решающее значение.

1

Это немного поле, длина которого 1 бит. Есть хорошее обсуждение на wikipedia.

3

это битовые поля.в структурах можно определить, сколько бит присваиваются переменным (переопределение стандарта для переменного типа)

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

см. следующий пример от the C book. перейдите по ссылке для получения дополнительной информации.

struct { 
     /* field 4 bits wide */ 
     unsigned field1 :4; 
     /* 
     * unnamed 3 bit field 
     * unnamed fields allow for padding 
     */ 
     unsigned  :3; 
     /* 
     * one-bit field 
     * can only be 0 or -1 in two's complement! 
     */ 
     signed field2 :1; 
     /* align next field on a storage unit */ 
     unsigned  :0; 
     unsigned field3 :6; 
}full_of_fields;