将位域的各个位联合起来
我目前正在为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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。