作为参数和函数的 return 的位域

A bit field as parameter and as return of the function

我有以下类型:

My_Union_t Data;
typedef union My_Union {
byte Byte;
 struct {
    byte b0:1;
    byte b1:1;                                       
    byte b2:1;
    byte b3:1;
    byte b4:1;
    byte b5:1;
    byte b6:1;
    byte b7:1;
 } Bits;
} My_Union_t;

因为位字段没有地址,我创建了一个函数来接收它 returns 它。

将位域作为参数传递是不是最好的方法?

Bits Invert(Bits Bit)
{
 return (~Bits)
}

void Function(void)
{    
 Data.Bits.b1 = Invert(Data.Bits.b1);     
}

您不能将 ~ 运算符应用于整个 struct Bits,只能应用于其各个部分。将数据类型更改为 byte 将解决此问题:

byte Invert(byte bit) {
    return (~bit);
}

这将编译并工作 (demo)。编译器将提供所有 "magic" 以进行适当的位操作。

如何传递参数和 returned 的细节在很大程度上取决于编译器。参数将以自然类型传递,例如 int。位域不是自然类型,它们的实现依赖于编译器。

通过将参数压入堆栈来将参数传递给函数。 return 值在寄存器中被 return 编辑。将值压入堆栈时,编译器会注意保持堆栈对齐,这意味着它将在 32 位机器上压入 32 位块,在 64 位机器上压入 64 位块。

在大多数系统上,即使是字节也不会作为字节传递,而是作为 int 传递。

(另一种方法是使用本机类型并自己进行位操作。)