是否可以将 C 中的结构打包为由位定义的大小

Is it possible to pack a struct in C to size defined by bits

我有以下结构

struct header {
    unsigned int op:16;
    unsigned int A:1;
    unsigned int B:1;
    unsigned int C:1;
    unsigned int pad:1;
}

int main() {
    struct header a;
     printf("size of header is: %lu\n", sizeof(a));

    return 0;
}

输出为size of header is: 4

如果我使用__attribute__((__packed__))

struct __attribute__((__packed__)) header {
    unsigned int op:16;
    unsigned int A:1;
    unsigned int B:1;
    unsigned int C:1;
    unsigned int pad:1;
}

int main() {
    struct header a;
    printf("size of header is: %lu\n", sizeof(a));

    return 0;
}

输出为size of header is: 3

有没有办法避免填充到 3 个字节?我可以只取所需的 20 位吗? 我需要它的原因之一是将结构转换为十六进制数,例如

struct header test1, test2;
test1.op = 1;
test1.A = 0;
test1.B = 1
test1.C = 0;
test1.pad = 0;

test2.op = 1024;
test2.A = 0;
test2.B = 1
test2.C = 1;
test2.pad = 0;

分别转换为 0x200010x60400,并希望尽可能避免删除填充

Is it possible to pack a struct in C to size defined by bits

没有

Is there a way to avoid the padding to 3 bytes?

没有

Can I take only the required 20 bits?

没有

最小的可寻址单位是一个字节。 C 中的所有内容都必须是字节的倍数。

(理论上,您可以使用具有 10 位字节的编译器(或 re-compile GCC),那么您的结构将恰好占用 2 个字节。那会很乏味,non-portable 和我会说荒谬)。但是,在任何现代平台上,一个字节都有 8 位。

C 2018 6.2.6 2 说:

Except for bit-fields, objects are composed of contiguous sequences of one or more bytes,…

因此,即使仅由 bit-field 组成的结构也不是 bit-field,但必须由整数字节组成。

(C 实现可以通过允许某些对象是小数字节来扩展 C 标准,但我不知道有任何 C 实现这样做。)