我目前正在研究一个嵌入代码的端口(在Freescale S12上),所以GNU和我与工会有一个问题。
我有以下工会

typedef signed short        sint16;
typedef signed long         sint32;

typedef union
{
    sint32 Akku;
    sint16 AkkuHigh;
    sint16 AkkuLow;
} akku_type;

我想访问联合的最高2字节。问题是,AkkuHigh和AkkuLow的起始地址都与Akku相同。它似乎是特定于编译器的。我的问题是:
是否存在改变联合行为的编译器标志?
阿蒂布特能帮我吗?
提前谢谢你

最佳答案

是的,所有的AkkuAkkuHighAkkuLow都有相同的地址。这就是unions在C中的工作方式。从外观上看,您打算用一个32位成员和一个由两个16位成员组成的结构的成员组成联合。你写的不是实现它的方法。请改为:

typedef union
{
    sint32 Akku;
    struct s {
      sint16 AkkuHigh;
      sint16 AkkuLow;
    } representation;
} akku_type;

07-24 14:04