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

bar*_*tal 1 c

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

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

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

unw*_*ind 5

我没有实现这一点,但我可以想象它与处理寄存器中的位字段,以及在可能的情况下读取/写入结构中的整个字有关.如果以这种方式实现它,而不是进行字节级访问,当然会"感觉"字节序,因为字在内存中是字节交换的.

所以,如果你有

 struct color {
  uint32_t red : 8;
  uint32_t green : 8;
  uint32_t blue : 8;
  uint32_t alpha : 8;
 };
Run Code Online (Sandbox Code Playgroud)

当你这样做

struct color orange = { .red = 255, .green = 127, .blue = 0, .alpha = 0 };
Run Code Online (Sandbox Code Playgroud)

它可能被实现(因为字段的大小很方便)

struct color orange;
uint32_t *tmp = *(uint32_t *) &orange;
*tmp = 0xff7f0000;  /* The field values, mapping red to the MSBs. */
Run Code Online (Sandbox Code Playgroud)

现在,由于上面做了一个单一uint32_t大小的内存写入,该值将在小端机器上进行字节交换,但不会在大端机器上进行字节交换,即,当逐字节查看时,表示形式是不同的.