使用位域时,字节中的位排序

时间:2014-09-09 07:03:49

标签: c

C参考手册指出“组件(尤其是位字段)打包到结构中的精确方式取决于实现,但对于每个实现都是可预测的”。

我读到一些编译器在Big endian机器中从左到右(MSB到LSB)包含位字段,而在Little endian机器中从右到左(LSB到MSB)。

有两个不同方式表示位域的原因/优势取决于字节顺序吗?

2 个答案:

答案 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)

结构内部位字段的布局是由实现定义的。如果您需要可移植的代码,则最好不要使用它们。