分配给结构成员的值不正确
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 编译器。
具有 _Bool
、signed int
、int
或 unsigned int
.
以外类型的位域是不可移植的
大小为 :2
的有符号位域可以容纳 -2, -1, 0, 1
的值。由于您似乎获得了这些值,这意味着您的实现正在对这些位域进行签名。
听起来你想要无符号位域,所以我建议使用 unsigned int
。
注意。在位域中,int
表示 signed int
还是 unsigned int
是实现定义的。因此,如果您使用纯 int
,它可能仍会根据编译器或设置给出不同的范围。
标准允许编译器扩展一个位域。许多人这样做是为了获得更好的性能。编译器实现 非常
unsigned somefield: 2 ;
为 32 位。我不鼓励完全使用位域。它们不是便携式的。如果您需要特定宽度的位域,最好的方法是使用位运算符进行插入和提取。
我完全不知道这里发生了什么,我真的很想知道。
我有一个枚举:
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 编译器。
具有 _Bool
、signed int
、int
或 unsigned int
.
大小为 :2
的有符号位域可以容纳 -2, -1, 0, 1
的值。由于您似乎获得了这些值,这意味着您的实现正在对这些位域进行签名。
听起来你想要无符号位域,所以我建议使用 unsigned int
。
注意。在位域中,int
表示 signed int
还是 unsigned int
是实现定义的。因此,如果您使用纯 int
,它可能仍会根据编译器或设置给出不同的范围。
标准允许编译器扩展一个位域。许多人这样做是为了获得更好的性能。编译器实现 非常
unsigned somefield: 2 ;
为 32 位。我不鼓励完全使用位域。它们不是便携式的。如果您需要特定宽度的位域,最好的方法是使用位运算符进行插入和提取。