是否可以将 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;
分别转换为 0x20001
和 0x60400
,并希望尽可能避免删除填充
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 实现这样做。)
我有以下结构
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;
分别转换为 0x20001
和 0x60400
,并希望尽可能避免删除填充
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 实现这样做。)