我今天遇到了一个问题,我发现我的字节中的位字段的排序方式取决于处理器的字节顺序。举个下一个例子:
struct S {
uint8_t a : 3;
uint8_t b : 5;
};
此结构占用一个字节,但位布局取决于机器:
因此,在一台小端机器上,它从LSB开始填充,在大端机器上开始从MSB填充。我曾经听过Stroustrup说这是实现跨平台可移植性的主要目标,但是留下这样的东西根本不可移植。如果我通过与某人的连接发送这个结构,他怎么知道哪些位映射到结构中的哪些字段?如果订单得到修复,会不会更容易?选择将这个开放给处理器和编译器的原因是什么?唯一安全的选择是使用位移和使用更多代码的掩码。如果我和我的同事可以依靠一个固定的顺序,例如小端的方式,那将会容易得多,但肯定有理由选择不这样做。
答案 0 :(得分:1)
它们不是由语言定义的,因此它可以适应您发现的确切情况。对于字节中的位字段没有区别,但位字段可以占用更大的整数类型。考虑这个例子:
struct bf
{
uint16_t a : 5;
uint16_t b : 11;
};
为了使字段的位在存储器中相邻,字节中的位必须根据处理器的字节顺序进行不同的布局。
Big endian:
aaaaabbb bbbbbbbb
Little endian:
bbbbbbbb bbbaaaaa