Código executável completo demonstrando comparação de tamanho de structs com padding, decodificação de bytes com union e empacotamento com Bit-Fields.


📄 Exemplo 1: Struct Padding e Alinhamento de Memória (padding_demo.c)

#include <stdio.h>
#include <stddef.h>

// Estrutura mal otimizada
struct Desordenada {
    char flag1;     // 1B + 7B padding
    double valor;   // 8B
    char flag2;     // 1B + 7B padding
};

// Estrutura reorganizada por tamanho decrescente
struct Otimizada {
    double valor;   // 8B
    char flag1;     // 1B
    char flag2;     // 1B + 6B padding final
};

int main(void) {
    printf("====================================================\n");
    printf(" 📐 AUDITORIA DE STRUCT PADDING E ALINHAMENTO DA CPU\n");
    printf("====================================================\n");

    printf("struct Desordenada:\n");
    printf("  Tamanho Total (sizeof): %zu bytes\n", sizeof(struct Desordenada));
    printf("  Offset de flag1:        +%zu bytes\n", offsetof(struct Desordenada, flag1));
    printf("  Offset de valor:        +%zu bytes\n", offsetof(struct Desordenada, valor));
    printf("  Offset de flag2:        +%zu bytes\n", offsetof(struct Desordenada, flag2));

    printf("----------------------------------------------------\n");
    printf("struct Otimizada:\n");
    printf("  Tamanho Total (sizeof): %zu bytes (Economia de %zu bytes!)\n", 
           sizeof(struct Otimizada), 
           sizeof(struct Desordenada) - sizeof(struct Otimizada));
    printf("  Offset de valor:        +%zu bytes\n", offsetof(struct Otimizada, valor));
    printf("  Offset de flag1:        +%zu bytes\n", offsetof(struct Otimizada, flag1));
    printf("  Offset de flag2:        +%zu bytes\n", offsetof(struct Otimizada, flag2));

    printf("====================================================\n");
    return 0;
}

📄 Exemplo 2: União e Campos de Bits para Hardware (hardware_union.c)

#include <stdio.h>
#include <stdint.h>

// União com Bit-Fields para inspecionar um registrador de hardware de 16 bits
typedef union {
    uint16_t registradorCompleto;
    struct {
        unsigned int habilitado     : 1; // Bit 0
        unsigned int modoOperacao   : 3; // Bits 1 a 3 (Modos 0 a 7)
        unsigned int nivelPrioridade: 4; // Bits 4 a 7 (0 a 15)
        unsigned int codigoStatus   : 8; // Bits 8 a 15 (0 a 255)
    } campos;
} RegistradorDispositivo;

int main(void) {
    RegistradorDispositivo dev;
    dev.registradorCompleto = 0xA519; // 0b10100101 00011001

    printf("====================================================\n");
    printf(" ⚡ REGISTRADOR DE HARDWARE COM UNION & BIT-FIELDS\n");
    printf("====================================================\n");
    printf(" Valor Bruto Hexadecimal: 0x%04X\n", dev.registradorCompleto);
    printf("----------------------------------------------------\n");
    printf(" Bit Habilitado:          %u\n", dev.campos.habilitado);
    printf(" Modo de Operacao (3b):   %u\n", dev.campos.modoOperacao);
    printf(" Nivel Prioridade (4b):   %u\n", dev.campos.nivelPrioridade);
    printf(" Codigo de Status (8b):   0x%02X\n", dev.campos.codigoStatus);
    printf("====================================================\n");

    return 0;
}