![](/img/trans.png)
[英]Why isn't my Struct char member being assigned the value 'F' and instead is staying the default initialization value?
[英]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
。
NB。 在位字段中, int
是有signed int
还是unsigned int
,由实现定义。 因此,如果您使用Plain int
,则根据编译器或设置,它可能仍会给出不同的范围。
该标准允许编译器扩展位字段。 许多这样做是为了获得更好的性能。 编译器实现非常普遍
unsigned somefield: 2 ;
作为32位。 我不鼓励完全使用位域。 它们不是便携式的。 如果需要特定宽度的位域,最好的方法是使用按位运算符插入和提取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.