C参考手册指出“组件(尤其是位字段)打包到结构中的精确方式取决于实现,但对于每个实现都是可预测的”。
我读到一些编译器在Big endian机器中从左到右(MSB到LSB)包含位字段,而在Little endian机器中从右到左(LSB到MSB)。
有两个不同方式表示位域的原因/优势取决于字节顺序吗?
答案 0 :(得分:5)
我没有实现这一点,但我可以想象它与处理寄存器中的位字段以及在可能的情况下读取/写入整个字的结构有关。如果你以这种方式实现它,而不是进行字节级访问,你当然会感觉到"字节的字节交换在内存中的字节顺序。
所以,如果你有
struct color {
uint32_t red : 8;
uint32_t green : 8;
uint32_t blue : 8;
uint32_t alpha : 8;
};
当你这样做时
struct color orange = { .red = 255, .green = 127, .blue = 0, .alpha = 0 };
它可能被实现(因为字段的大小很方便)为
struct color orange;
uint32_t *tmp = *(uint32_t *) &orange;
*tmp = 0xff7f0000; /* The field values, mapping red to the MSBs. */
现在,由于上面只进行了一次uint32_t
大小的内存写入,因此该值将在小端机器上进行字节交换,但不会在大端机器上进行字节交换,即逐字节查看时,表达方式不同。
答案 1 :(得分:1)
结构内部位字段的布局是由实现定义的。如果您需要可移植的代码,则最好不要使用它们。