c - 使用 union 强制 C 位域对齐

标签 c struct bit-fields memory-alignment unions

我想知道是否可以在 C 中强制对齐位域。使用下面代码中的变量我知道写入 _align_bytes 然后从 读取未定义(反之亦然),因为它取决于实现。下面的代码是否是“说服”连续存储在无符号短整型大小的内容中的有效方法?我相信(除去任何字节序问题)此代码是正确的...但位域和 union 是我最不熟悉的两个 C 主题。

我正在做一个低级微 Controller 项目,并且想要一种无需大量位掩码即可读取配置位的简单方法。感谢您的任何提示和建议。

山姆

附注请忽略我对字节顺序所做的任何假设,因为我正在从事的这个项目的级别非常低,并且不打算移植到其他设备/平台。

#include <stdio.h>
#include <assert.h>

typedef union packet {
    struct {
        unsigned int bit0  : 1;
        unsigned int bit1  : 1;
        unsigned int bit2  : 1;
        unsigned int bit3  : 1;
        unsigned int bit4  : 1;
        unsigned int bit5  : 1;
        unsigned int bit6  : 1;
        unsigned int bit7  : 1;
        unsigned int bit8  : 1;
        unsigned int bit9  : 1;
        unsigned int bit10 : 1;
        unsigned int bit11 : 1;
        unsigned int bit12 : 1;
        unsigned int bit13 : 1;
        unsigned int bit14 : 1;
        unsigned int bit15 : 1;
    } bits;

    unsigned short _align_bytes;
} packet_t;

int main(int argc, char *argv[]) {

    assert(sizeof(unsigned short) == 2);

    unsigned short data = 0xA05F;
    packet_t *p = (packet_t *)&data;

    printf("%u", p->bits.bit15);
    printf("%u", p->bits.bit14);
    printf("%u", p->bits.bit13);
    printf("%u", p->bits.bit12);
    printf("%u", p->bits.bit11);
    printf("%u", p->bits.bit10);
    printf("%u", p->bits.bit9);
    printf("%u", p->bits.bit8);
    printf("%u", p->bits.bit7);
    printf("%u", p->bits.bit6);
    printf("%u", p->bits.bit5);
    printf("%u", p->bits.bit4);
    printf("%u", p->bits.bit3);
    printf("%u", p->bits.bit2);
    printf("%u", p->bits.bit1);
    printf("%u", p->bits.bit0);

    return 0;
}

最佳答案

这是一种常见的模式,据我所知,答案是肯定的:位字段将是连续的,并与 _align_bytes 字段占用相同的内存。这就是 union 的全部意​​义,对吗?查看相同内存的不同方式。

我不确定“写入 _align_bytes 然后从位读取未定义”是什么意思。我看到的唯一问题是字节顺序:bit0 可能是 _align_bytes 的 lsb 或 msb。如果您不希望它是可移植的,那么您只需要进行快速测试即可确定它是什么,然后就可以设置了。

关于c - 使用 union 强制 C 位域对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8854331/

相关文章:

c - 动态内存分配 - realloc() : invalid next size

c - 在 C 结构中初始化矩阵变量

python - 从整数制作 python 位数组 - 奇怪的结果!

c - sizeof(struct) 对于不同的编译器是不同的

c - 尝试从结构中检索 U32 时程序崩溃

c - 如何在 C 中的结构中打印长度为 8 的多个位域

c - 在文件和目录中搜索的问题.. windows 编程

c - "Source file is more recent than executable"除了它不是

c++ - 关闭后等待文件删除

C++ 比较器对结构 vector 进行无效排序