我想知道是否可以在 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/