为什么结构字节中的位字段顺序不是由语言本身定义的?

时间:2017-11-30 23:01:16

标签: c++ struct endianness bit-fields

我今天遇到了一个问题,我发现我的字节中的位字段的排序方式取决于处理器的字节顺序。举个下一个例子:

struct S {
    uint8_t a : 3;
    uint8_t b : 5;
};

此结构占用一个字节,但位布局取决于机器:

  • 小端:b4 b3 b2 b1 b0 a2 a1 a0
  • 大端:a2 a1 a0 b4 b3 b2 b1

因此,在一台小端机器上,它从LSB开始填充,在大端机器上开始从MSB填充。我曾经听过Stroustrup说这是实现跨平台可移植性的主要目标,但是留下这样的东西根本不可移植。如果我通过与某人的连接发送这个结构,他怎么知道哪些位映射到结构中的哪些字段?如果订单得到修复,会不会更容易?选择将这个开放给处理器和编译器的原因是什么?唯一安全的选择是使用位移和使用更多代码的掩码。如果我和我的同事可以依靠一个固定的顺序,例如小端的方式,那将会容易得多,但肯定有理由选择不这样做。

1 个答案:

答案 0 :(得分:1)

它们不是由语言定义的,因此它可以适应您发现的确切情况。对于字节中的位字段没有区别,但位字段可以占用更大的整数类型。考虑这个例子:

struct bf
{
    uint16_t a : 5;
    uint16_t b : 11;
};

为了使字段的位在存储器中相邻,字节中的位必须根据处理器的字节顺序进行不同的布局。

Big endian:

aaaaabbb bbbbbbbb

Little endian:

bbbbbbbb bbbaaaaa