分配给结构成员的值不正确

Value assigned to struct member is incorrect

我完全不知道这里发生了什么,我真的很想知道。

我有一个枚举:

typedef enum
{
    TAxCLK = 0,
    ACLK,
    SMCLK,
    INCLK

} TIMER_A_CLOCK_E;

和一个结构:

typedef struct
{
    BYTE byTimerSelection           :2;
    TIMER_A_CLOCK_E eClockSource    :2;
    INPUT_DIV_E eInputDivider       :2;
    TIMER_MODE_E eTimerMode         :2;

} TIMER_A_S;

其中最后两个成员是与另一个相似的枚举,第一个只是 unsigned char。这个 struct 用于初始化微控制器上的寄存器,所以我将每个字段限制为 2 位。

我这样分配 struct 的成员:

 TIMER_A_S stTimerInfo;

 // Setup Timer A
 stTimerInfo.byTimerSelection = 0;
 stTimerInfo.eClockSource = SMCLK;
 stTimerInfo.eInputDivider = INPUT_DIV_1;
 stTimerInfo.eTimerMode = UP;

但是,eClockSource 成员的行为异常。 Code Composer 调试器将该字段显示为 32 位而不是 2,最后分配给它的值是 -2 而不是 2。经过一些实验,我发现写入 0 会导致读取 0 并将 5 写入到它导致它读取 2... 发生了什么事?其他成员表现得很好。它是用于 32 位控制器的 TI ARM 编译器。

具有 _Boolsigned intintunsigned int.

以外类型的位域是不可移植的

大小为 :2 的有符号位域可以容纳 -2, -1, 0, 1 的值。由于您似乎获得了这些值,这意味着您的实现正在对这些位域进行签名。

听起来你想要无符号位域,所以我建议使用 unsigned int

注意。在位域中,int 表示 signed int 还是 unsigned int 是实现定义的。因此,如果您使用纯 int,它可能仍会根据编译器或设置给出不同的范围。

标准允许编译器扩展一个位域。许多人这样做是为了获得更好的性能。编译器实现 非常

     unsigned somefield: 2 ;

为 32 位。我不鼓励完全使用位域。它们不是便携式的。如果您需要特定宽度的位域,最好的方法是使用位运算符进行插入和提取。