gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:21 25 4
gpt4 key购买 nike

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

我有一个枚举:

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 用于初始化微 Controller 上的寄存器,因此我将每个字段限制为 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 位 Controller 的 TI ARM 编译器。

最佳答案

具有_Boolsigned intintunsigned 以外类型的位域是不可移植的整数

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

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

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

关于c - 分配给结构成员的值不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com