难以理解工会中的结构

时间:2017-12-20 19:32:53

标签: c

我不是新手C玩家,也不是我的专家。所以这是我的问题。 我有一个工会宣称为:

typedef union
{
    // 8-bit data
    struct
    {
        UINT16 data8bit : 8;
    };

    // 9-bit data
    struct
    {
        UINT16 data9bit : 9;
    };

    UINT16 __data;
} EXAMPLE_DATA;

还有一个功能如下:

SendData(EXAMPLE_DATA data)
{  
    //.....
}

现在这是我的问题。 我想创建EXAMPLE_DATA的对象,以便在传递给SendData函数时,我的数据将为data9bit类型。

我真的很困惑,老实说我不知道​​答案。 感谢。

2 个答案:

答案 0 :(得分:4)

由于你的两个工会成员是匿名结构,这很复杂,但事实上,原则上,EXAMPLE_DATA类型的对象只包含一个值成员 - 在任何给定时间写入的最后一个成员。该成员是__data或两个匿名结构之一。

结构仅用作位域的容器,每个都是一个,并且因为它们是匿名的,所以可以通过访问类型EXAMPLE_DATA本身的成员的语法在联合内部访问它们的成员。因此,如果您希望当前包含EXAMPLE_DATA的成员是相应结构的data9bit,那么您可以这样做:

EXAMPLE_DATA data;

data.data9bit = 256;

请注意,

  • 匿名结构可能具有大于16位的表示
  • 每个位域的相关位在其结构表示中的位置在很大程度上由实现决定,特别是,它不一定在前16位内(它们将与{{的表示重叠) 1}})
  • 您的联盟没有提供内置机制,通过该机制可以确定哪个成员当前包含值,因此用户需要假设或将这些信息单独传达给他们。

答案 1 :(得分:0)

类型EXAMPLE_TYPE的大小始终为2个字节(即16位),因为只能存储和寻址完整的字节。

您可以自由地值解释为9位值,但大小始终是整数个字节。