Битовое поле в C; байты и биты

Я нашел следующий пример:

#include <stdio.h> 
  
// Space optimized representation of the date 
struct date { 
    // d has value between 1 and 31, so 5 bits 
    // are sufficient 
    unsigned int d : 5; 
  
    // m has value between 1 and 12, so 4 bits 
    // are sufficient 
    unsigned int m : 4; 
  
    unsigned int y; 
}; 
  
int main() 
{ 
    printf("Size of date is %lu bytes\n", sizeof(struct date)); 
    struct date dt = { 31, 12, 2014 }; 
    printf("Date is %d/%d/%d", dt.d, dt.m, dt.y); 
    return 0; 
}

Результаты

Size of date is 8 bytes
Date is 31/12/2014

Я не могу понять первый результат. Почему 8 байт?

Мои мысли: y — 4 байта, d — 5 бит и m — 4 бита. Всего 4 байта и 9 бит. 1 байт - это 8 бит, тогда всего 41 бит.

Ответ — выравнивание. Из соображений эффективности компилятор выравнивает значения по эффективным границам. Это избавит процессор от необходимости выполнять всевозможные дополнительные операции.

Cheatah 14.12.2020 13:17

Наименьшая единица - байты, поэтому 8 цифр -> 8 байтов

ralf htp 14.12.2020 13:19

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

Andrew Henle 14.12.2020 13:20

@Cheatah, хорошо, мы можем оптимизировать пространство, используя битовые поля. но как? почему он равен 8 байтам? как вычислили?

Noel Miller 14.12.2020 13:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
163
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Очень хорошее объяснение здесь

C автоматически упаковывает вышеуказанные битовые поля настолько компактно, насколько это возможно, при условии, что максимальная длина поля меньше или равна целочисленной длине слова компьютера. Если это не так, то некоторые компиляторы могут допускать перекрытие памяти для полей, в то время как другие сохранят следующее поле в следующем слове (см. комментарии о переносимости битовых полей ниже).

Другие вопросы по теме