Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Manal jainОтветов: 2

Пожалуйста, объясните, как выполняется этот код. Почему мы использовали ":" в структурах. Каково использование двоеточия в структурах. Что должно быть на выходе оператора 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;
}
  • : используется для определения битового поля в struct (или union). Fiddling Bits 05.06.2020
  • Я думаю, что единственный ответ на то, что должно быть на выходе оператора sizeof, это зависит. Размер слова архитектуры, выравнивание и отступы и т. д. Fred Larson 05.06.2020

cstructsignedunsigned

Ответы

Ответ 1 · рейтинг 1 · Fred Larson

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

Теперь вопрос "каким должен быть вывод оператора 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.

Ответ 2 · рейтинг 4 · kptnbmb

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы