【发布时间】:2010-04-19 01:37:28
【问题描述】:
首先,有问题的应用程序总是在同一个处理器上,编译器总是 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 个位?
请注意,我无法控制这些位的布局位置:这是由其他人的界面定义的位布局。
【问题讨论】:
-
"gcc 对位域进行布局,使第一个列出的域对应于字节的最低有效位。"不,GCC(在这种情况下包括
g++,它继承了 C 实现定义的行为)以 ABI 相关的顺序布置位域:gcc.gnu.org/onlinedocs/gcc/…。这是否恰好对您的架构进行 lsbit-up 纯属偶然。
标签: c++ c gcc bit-fields