联合和内存对齐的问题

时间:2014-12-03 17:41:50

标签: c++ c memory unions

我目前正在开发一个嵌入式代码端口(在飞思卡尔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)))可以帮助我吗?

先谢谢你

2 个答案:

答案 0 :(得分:3)

是的,AkkuAkkuHighAkkuLow的所有地址都相同。这就是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位)。

根据架构的字节顺序,您可能需要交换AkkuHighAkkuLow