gpt4 book ai didi

c - 请澄清我对 C 中位域和 union 的理解

转载 作者:行者123 更新时间:2023-11-30 15:11:59 26 4
gpt4 key购买 nike

我正在研究微 Controller 驱动程序文件,但无法理解 union 和位字段的正确使用

typedef union
{
uint8 U; //Unsigned
sint8 I; //signed
Register_x_Bits B; //Bit field access
}u1;

typedef struct _Register_x_Bits //8 bit register size
{
uint8 Field1:1; //endianness is maintained for all registers
uint8 Field2:1;
uint8 Field3:1;
uint8 Field4:1;
uint8 Field5:4;
}Register_x_Bits;


u1 reg;

reg.U = ReadRegister(); // data is initially being read from the register

//based on the previous data a bit value needs to be changed in particular location of the data

reg.B.Field3 = 0;

WriteRegister(reg.U);

这就是我难以理解的地方

1) 只需更改 reg.B.Field3位字段值,它是否只更改一个特定位(在本例中为字段 3),还是清除寄存器中所有先前的数据并用新的 reg.B.Field3 填充它?

许多教程都指出 Unions 中只有一名活跃成员

2) 我可以更改同一寄存器中的多个位字段吗?我可以用上面相同的方法更改它们并保持其余部分不变

reg.B.Field1 =0;
reg.B.Field3 =1;
reg.B.Field4 =1100;

编辑 enter image description here

设整个寄存器值为1111 0 1 0 1现在如果我改变 Fields 1,3,4它会影响 Fields 0,2 中的值吗? ?

最佳答案

好的,首先检查下面的代码

#include <stdio.h>
typedef struct _BITS{
unsigned char f1:1;
unsigned char f2:1;
unsigned char f3:1;
unsigned char f4:1;
unsigned char f5:4;

}BITS;
typedef union {
unsigned char a;
char b;
BITS c;
}u1;

int main(void) {
u1 reg;
reg.a = 255;
reg.c.f1 = 0;
//reg.c.f2 = 1;
printf("%d", reg.c.f1);
printf("%d", reg.c.f2);
return 0;
}

为了模仿 ReadRegister(),我编写了 reg.a = 255。所以现在当我写 reg.c.f1 = 0 时,如果它改变了所有位,那么 reg.c.f2 也会打印 0。但这并没有发生。位字段仅针对该特定位,而不是整个字节。因此不,它只会清除那一点

现在,如果我编写 reg.a = 0reg.c.f1 = 255 并且如果它设置了所有位,则为 reg.c。 f2 会产生 1,但事实并非如此。因此不,你不能设置位字段的所有位

编辑不过,您可以通过其他方式设置多个位。请参阅@sdao 的回答

希望能解答您的问题

关于c - 请澄清我对 C 中位域和 union 的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35307991/

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