首先,有问题的应用程序总是在同一个处理器上,编译器总是gcc,所以我不关心位域不可移植。如何获得位域以正确的顺序排列我的位?
gcc设置位域,使得第一个列出的字段对应于一个字节的最低有效位。所以下面的结构,具有一个 = 0,b = 1,Ç = 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 ++)
现在,让我们说,我想一个是一个六位整数。
现在,我可以看到为什么这是不行的,但我的编码结构如下:
struct Bits2 {
unsigned int a:6;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));
设置b,Ç,并d为1,一个为0导致以下两个字节:
c0 01
这不是我想要的。我希望看到这一点:
e0 00
有什么方法来指定在第一个字节的最显著位三位和六位跨越第一字节和五个最显著位的结构第二个最重要的位?
请注意,我无法控制这些位应该放在哪里:它是由别人的界面定义的位布局。
“gcc列出位域,使得第一个列出的字段对应于一个字节的最低有效位。”不,GCC(在这种情况下包括'g ++',它继承C实现定义的行为)以ABI依赖的顺序列出位域:https://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations-和-bit-fields-implementation.html。无论这种情况发生在你的架构上,都是偶然的。 – 2016-01-05 13:38:18