我有以下类型的结构
typedef struct
{
unsigned int a : 8;
unsigned int b : 6;
unsigned int c : 2;
}x, *ptr;
我想做的是更改字段 c 的值。
我做了类似下面的事情
x structure = { 0 };
x->c = 1;
当我查看内存映射时,我希望找到 00 01,但我却找到 00 40。 看起来在排列第二个字节时,它将c字段放在最低位,将b字段放在最高位。我在 GCC 和 Windows 编译器上都看到过这种情况。
目前,我所做的如下,工作正常。
unsigned char ptr2 = (unsigned char*) ptr
*(ptr2 + 1) &= 0xFC
*(ptr2 + 1) |= 0x01
我看内存映射是错误的吗? 感谢您的帮助。
最佳答案
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
}
关于c - 在 C 中使用位字段时的字段顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53984054/