[visual-studio]为什么这种结构的大小是 5 时应该是 4

标签: Visual-Studio
发布时间: 2014/3/1 3:59:48
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想打包到一个结构的一些数据。

结构定义如下:

#pragma pack(push)
#pragma pack(1)
struct Data
{
    unsigned char i:2;
    unsigned short r:14;
    unsigned short c:14;
};
#pragma pack(pop)

由于位的数目是 30,包是其中一个,我的理解是此结构的大小应是 4,但编译器说它的大小是 5 个字节。

我使用的 Visual Studio 2012。

请注意他们是位域。

这有 4 的大小:

struct Data
{
    unsigned short i:2;
    unsigned short r:14;
    unsigned short c:14;
};

解决方法 1:

位字段在内存中的精确布局不是由标准指定的。然而,我相当确信,如果您使用 unsigned int 的所有字段,像这样:

struct Data
{
    unsigned int i:2;
    unsigned int r:14;
    unsigned int c:14;
};

您的数据将打包到一个 30 位整数值。不过,既然你已宣布的第一个字段一个 char,它可以不举行 14 位的值,并因此被视为一个单独的字段。

(gcc 给 4 个字节的两个变体,这是我说那里是编译器-因此之间的差异没有什么说明字段不标准中定义的标准的原因之一)

官方微信
官方QQ群
31647020