难以理解工会中的结构

问题描述 投票:2回答:2

我不是新手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类型。

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

c
2个回答
4
投票

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

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

EXAMPLE_DATA data;

data.data9bit = 256;

请注意,

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

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.