首先,有问题的应用程序总是在同一个处理器上,编译器总是 gcc,所以我不担心位域不可移植。
gcc 对位域进行布局,使第一个列出的域对应于字节的最低有效位。所以下面的结构,a =0, b =1, c =1, d =1,你得到一个字节值 e0。
struct Bits {
unsigned int a:5;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));
(其实这是C++,所以我说的是g++。)
现在假设我希望a是一个六位整数。
现在,我明白为什么这不起作用了,但我编写了以下结构:
struct Bits2 {
unsigned int a:6;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));
将b、c和d设置为 1,将 a设置为 0 会产生以下两个字节:
c0 01
这不是我想要的。我希望看到这个:
e0 00
有没有办法指定一个结构,它在第一个字节的最高有效位中有 3 位,在第一个字节的 5 个最低有效位和第二个字节的最高有效位中有 6 个位?
请注意,我无法控制这些位的布局位置:它是由其他人的界面定义的位布局。