我目前正在开发一个嵌入式代码端口(在飞思卡尔S12上),因此GNU和我的工会存在问题。 我有以下联盟
typedef signed short sint16;
typedef signed long sint32;
typedef union
{
sint32 Akku;
sint16 AkkuHigh;
sint16 AkkuLow;
} akku_type;
我希望访问联合的最高2字节。问题是,AkkuHigh和AkkuLow都有与Akku相同的起点。它似乎是编译器特定的。我的问题是: 是否存在改变联合行为的编译器标志? 属性((align(2)))可以帮助我吗?
先谢谢你
答案 0 :(得分:3)
是的,Akku
,AkkuHigh
,AkkuLow
的所有地址都相同。这就是unions在C中的工作方式。从它的角度来看,您打算与32位成员和一个由两个16位成员构成的成员建立联合。你写的不是实现它的方法。请尝试改为:
typedef union
{
sint32 Akku;
struct s {
sint16 AkkuHigh;
sint16 AkkuLow;
} representation;
} akku_type;
答案 1 :(得分:0)
联盟的正确定义可以在this answer中找到。
如果您在32位或64位架构上编译, atribute(align(2))
肯定会对您有所帮助。此外,在64位sizeof(sint32)
上是8
(64位)。
根据架构的字节顺序,您可能需要交换AkkuHigh
和AkkuLow
。