将位域的各个位联合起来

编程语言 2026-07-09

我目前正在为Game Boy Advance模拟器工作,并希望把位域中的各个位联合起来,同时让结构体尽量紧凑(因为我要从内存中读取并强制转换为该类型,所以需要它占用2 个字节)。

这是我尝试过的:

struct OAMAttribute0 {
    union {
        u16 raw;
        struct {
            u16 ypos:             8; // 0-255
            u16 rotation_scaling: 1; // 0=off, 1=on
            union { // this union should use only one bit
                u16 double_size:  1; // when rotation/scaling used
                u16 obj_disable:  1; // 0=normal, 1=not displayed
            } __attribute__((packed));
            u16 mode:             2; // 0=normal, 1=semi-transparent, 2=obj window, 3=prohibited
            u16 mosaic:           1; // 0=off, 1=on
            u16 colors:           1; // 0=16/16, 1=256/1
            u16 shape:            2; // 0=square, 1=horizontal, 2=vertical, 3=prohibited
        };
    };
};
static_assert(sizeof(OAMAttribute0) == 2);

这真的可行吗?我可以通过在联合体中使用 __attribute__((packed)) 将其压缩到4 字节,但似乎无法达到我需要的2 字节。

当然,我也可以直接做一个融合的位域,但如果能把每一位都明确命名就更好了。

解决方案

你想要的并不可行。联合体或结构体的长度至少为1 字节。

最接近的做法是使用 #define 将一个字段别名为另一个字段。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章