Я всегда думал, что я знал, C очень хорошо, пока я не видел что-то подобное в другом посте:Вопрос о C построить
struct foo {
int x:1;
};
Я действительно хотел бы знать цель из: 1. Может кто-нибудь подскажет мне? Благодарю.
Я всегда думал, что я знал, C очень хорошо, пока я не видел что-то подобное в другом посте:Вопрос о C построить
struct foo {
int x:1;
};
Я действительно хотел бы знать цель из: 1. Может кто-нибудь подскажет мне? Благодарю.
bitfield. x имеет длину 1 бит.
Каждое поле доступ и манипулировать , как если бы он был обычным членом структуры. Ключевые слова, подписанные и unsigned, означают, что вы ожидаете, , за исключением того, что интересно отметить , что однобитовое поле со знаком на машине с дополнительным номером может принимать значения 0 или -1 только . В объявлениях указывается , которые разрешены для включения летучих отборочных команд const и .
Основное использование битовых полей является либо позволяют плотно упаковать данные или быть в состоянии указать поля внутри некоторых внешне произведенных файлов данных. C не дает никаких гарантий при заказе полей в машинных словах, поэтому если вы используете , воспользуйтесь ими по последней причине, вы не будете несовместимы с программой , тоже будет зависимой от компилятора. В стандарте указано, что поля упакованы в «единицы хранения», которые являются типично машинами. Заказ на упаковку , и может ли битпотол пересечь границу блока хранения, определены . Чтобы установить выравнивание на границу хранилища, , поле ширины нулевой точки используется до уровня , который вы хотите выровнять.
Будьте осторожны, используя их. Это может потребовать удивительное количество кода времени выполнения для управления этими вещами, и вы можете в конечном итоге использовать больше места, чем они сохранить.
Бит-поля не имеют адресов - вы не можете иметь указатели на них или массивы из них.
http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html
Этот синтаксис используется для обозначения битовых полей (т.е. полей битов, которые являются более узкими, чем сам тип данных), так что «х» в вашем примере действительно использует 1 бит в межд ,
Более полезным примером может быть что-то вроде
char x:4;
char y:4;
Это пакет два 4-битовых полей в один байт. Преимущество, конечно же, в экономии места в архитектуре, где каждый байт имеет решающее значение.
Это немного поле, длина которого 1 бит. Есть хорошее обсуждение на wikipedia.
это битовые поля.в структурах можно определить, сколько бит присваиваются переменным (переопределение стандарта для переменного типа)
в приведенном выше примере, х использует только 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;
Спасибо! Но какое преимущество имеет это, просто объявляя это регулярным целым? –
@Joe M: Он потенциально использует меньше места. Это более полезно, когда у вас есть несколько битполей, поскольку компилятор (надеюсь) использует меньше памяти для каждой структуры в этом случае, чем несколько int. –
Каждый раз, когда вы хотите получить доступ к ним, вы можете получить доступ к полям отдельно, а не писать бит-манипулирование. – Joey