繁体   English   中英

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

[英]Bit ordering in a byte when using bitfields

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

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

是否有理由/优势以两种不同方式表示位字段取决于字节顺序?

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

所以如果你有

 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大小的内存,因此该值将在小字节序的机器上进行字节交换,而不在大字节序的机器上进行字节交换,即,按字节查看时,表示形式有所不同。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM