Почему этот код содержит двоеточие в структуре?

Пожалуйста, объясните, как выполняется этот код. Почему мы использовали ":" в структурах. Каково использование двоеточия в структурах. Что должно быть на выходе оператора sizeof.

#include <stdio.h>
int main()
{
struct bitfield {
    signed int a : 3;
    unsigned int b : 13;
    unsigned int c : 1;
};
struct bitfield bit1 = { 2, 14, 1 };
printf("%ld", sizeof(bit1));
return 0;
}

person Manal jain    schedule 05.06.2020    source источник
comment
: используется для определения битового поля в struct (или union).   -  person Fiddling Bits    schedule 05.06.2020
comment
Я думаю, что единственный ответ на то, что должно быть на выходе оператора sizeof, это зависит. Размер слова архитектуры, выравнивание и отступы и т. д.   -  person Fred Larson    schedule 05.06.2020


Ответы (2)


Оператор : используется для битовых полей, то есть целых значений, которые использовать указанное количество битов большего пространства. Они могут быть объединены в машинные слова для экономии места, но фактическое поведение определяется реализацией.

Теперь вопрос «каким должен быть вывод оператора sizeof» прост, но ответ сложен.

Оператор sizeof говорит, что возвращает количество байтов, но определение " байты» не обязательно то, что вы думаете. Байт должен быть не менее 8 бит, но может быть и больше. 9, 12 и 16 бит не являются чем-то необычным.

sizeof(int) для данной платформы может варьироваться в зависимости от размера слова архитектуры. Предполагая размер байта 8 бит, sizeof(int) может быть 2, 4 или 8. Возможно, больше. При размере байта 16 sizeof(int) на самом деле может быть 1.

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

Скорее всего, вы используете платформу Intel с 8-битными байтами и 32- или 64-битными ints, и компилятор, вероятно, упакует битовые поля. Поэтому ваш sizeof(bit1), скорее всего, будет 4 или 8.

person Fred Larson    schedule 05.06.2020

Это часть синтаксиса битовых полей. Здесь это означает, что a занимает 3 бита, b 13 бит и c только 1 бит. Конечно, структура не будет занимать в памяти только 17 бит, так как она должна быть выровнена по байтам как наименьшему адресуемому блоку памяти, поэтому sizeof(bit1) будет как минимум 3 байта (вероятно, она будет выровнена по какому-то значению, связанному с машинным словом, например 4 байта). Подробнее о выравнивании можно прочитать здесь: заполнение и упаковка структуры. Я предположил, что 1 байт равен 8 битам, но есть некоторые старые или экзотические архитектуры, в которых байты имеют другой размер.

person kptnbmb    schedule 05.06.2020