C 标准允许编译器以任何顺序放置位域。没有可靠且可移植的方法来确定顺序。
如果您需要知道确切的位位置,最好使用普通的无符号变量和位掩码。
这是使用位域的一种可能替代方法:
#include <stdio.h>
#define MASK_A 0x00FF
#define MASK_B 0x3F00
#define MASK_C 0xC000
#define SHIFT_A 0
#define SHIFT_B 8
#define SHIFT_C 14
unsigned GetField(unsigned all, unsigned mask, unsigned shift)
{
return (all & mask) >> shift;
}
unsigned SetField(unsigned all, unsigned mask, unsigned shift, unsigned value)
{
return (all & ~mask) | ((value << shift) & mask);
}
unsigned GetA(unsigned all)
{
return GetField(all, MASK_A, SHIFT_A);
}
unsigned SetA(unsigned all, unsigned value)
{
return SetField(all, MASK_A, SHIFT_A, value);
}
/* Similar functions for B and C here */
int main(void)
{
unsigned myABC = 0;
myABC = SetA(myABC, 3);
printf("%u", GetA(myABC)); // Prints 3
}