作为参数和函数的 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 传递。
(另一种方法是使用本机类型并自己进行位操作。)
我有以下类型:
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 传递。
(另一种方法是使用本机类型并自己进行位操作。)