我有一个结构来表示 29 位 CAN 标识符,其位字段如下。
struct canId
{
u8 priority :3;
u8 reserved :1;
u8 dataPage :1;
u8 pduFormat :8;
u8 pduSpecific :8;
u8 sourceAddress :8;
} iD;
在我的代码中,我想将此结构复制到整数变量。就像是:
int newId = iD;
不过我不确定这是否正确。有人可以评论一下吗?
编辑:我可以在每个字段上使用移位运算符,然后使用按位或将它们放在正确的位置。但这首先使得使用具有位字段的结构毫无用处。
对于真正的可移植解决方案,您不应该使用位域结构at all,因为字段布局未定义。相反,请使用整数和显式按位算术。
但对于更轻松的解决方案,int 与位域结构的联合就足够了。
为了兼顾安全性和便利性,您还可以考虑集成一个测试功能,一次切换一个字段并检查与所需整数的匹配。
union
{
uint32_t packed;
struct canId
{
u8 priority :3;
u8 reserved :1;
u8 dataPage :1;
u8 pduFormat :8;
u8 pduSpecific :8;
u8 sourceAddress :8;
} split;
} iD;
iD.packed= 0; iD.split.priority= 7; if (iD.packed != 0x7) ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)