两个4位位字段的总和不超过一个字节-如何解决?

aj3*_*423 3 c++ visual-c++

我尝试将库从linux移植到win32,有一个结构定义为:

struct X {
    unsigned int    type : 4;
    unsigned int    tag : 4;
}__attribute__((packed));
Run Code Online (Sandbox Code Playgroud)

大小应为1,我将其更改为:

#pragma pack(push, 1)
struct X {
    unsigned int    type : 4;
    unsigned int    tag : 4;
};
#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

但是sizeof(X)仍然是4,编码会混乱,如何将大小更改为1?

gez*_*eza 7

使用unsigned char代替unsigned int

struct X {
    unsigned char type : 4;
    unsigned char tag : 4;
};

static_assert(sizeof(X)==1);
Run Code Online (Sandbox Code Playgroud)

  • @taskinoor:它是实现定义的。MSVC更加重视基本类型。它实际上使用此类型进行访问。因此,如果类型为unsigned int,它将使用32位操作访问该位字段(即使该字段只有4位宽)。 (2认同)