1

我在下面定义了以下结构。

typedef union
{
    struct
    {
        unsigned command:15;
        unsigned acknowledge:1;
    };
    struct
    {
        unsigned short uicommand;
    };
    struct
    {
        Byte command_bytes[2];
    };
}TCOMMAND;

然后声明一个 TCOMMAND EG 类型的变量

TCOMMAND mycommand
int x=sizeof(mycommand)

x 的值是 4 个字节而不是 2。对这个问题的启发将不胜感激。
提前致谢。

4

3 回答 3

2

也许是因为unsigned int有 4 字节对齐。如果您对命令确认成员使用unsigned short,则结构将是 2 个字节大。

于 2013-01-06T00:30:09.320 回答
2

在 C/C++unsignedunsigned int,即使您没有分配位域的所有位,编译器仍会将您的结构调整为指定的数据类型。

因此,假设一个 32 位int(这是 Visual C++ 中的默认值),联合的第一个结构与以下内容相同:

struct
{
    unsigned int command:15;
    unsigned int acknowledge:1;
    unsigned int __unused:16;
};

这是四个字节。unsigned short 如果您希望它只有两个字节,请在您的第一个结构中使用:

struct
{
    unsigned short command:15;
    unsigned short acknowledge:1;
};
于 2013-01-06T00:37:47.493 回答
2

这是由编译器选项引起的。较新的编译器进行内存对齐。这也会影响工会/结构的规模。有一些 pragma 解决方案,例如#pragma pack. 查看并尝试下面的代码。

#pragma pack(push, 1)
typedef union
{
    struct
    {
        unsigned command:15;
        unsigned acknowledge:1;
    };
    struct
    {
        unsigned short uicommand;
    };
    struct
    {
        Byte command_bytes[2];
    };
}TCOMMAND;
#pragma pack(pop)

push, 1告诉编译器将块对齐到 1 个字节。这是旧编译器的默认值,但可能会随着较新的编译器而改变。

于 2013-01-06T00:40:07.837 回答