繁体   English   中英

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

[英]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

NB。 在位字段中, int是有signed int还是unsigned int ,由实现定义。 因此,如果您使用Plain int ,则根据编译器或设置,它可能仍会给出不同的范围。

该标准允许编译器扩展位字段。 许多这样做是为了获得更好的性能。 编译器实现非常普遍

     unsigned somefield: 2 ;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM