这是如何工作的?
a和b是两个独立的int变量还是使用不同的位域表示的相同变量?
struct {
int a : 21;
int b : 11;
};
a和b是两个独立的int变量还是使用不同的位域表示的相同变量?
struct {
int a : 21;
int b : 11;
};
这是一个 struct
中的两个独立变量,一个名为 a
,另一个名为 b
。然而,它们的大小分别为 21 位和 11 位,访问并操纵一个变量不会影响另一个变量。
希望这可以帮到您!
这取决于系统架构如何实现。如果您采用更直接的例子:
struct x {
uint8_t a : 2;
uint8_t b : 3;
};
这里有可能会出现a
和b
共享同一字节的内存,例如:xxxb bbaa(其中x未使用)。
我认为对齐和打包的语义是未定义的 - 最好尝试一下!如果您正在进行多平台项目,请注意不同的硬件(甚至编译器)。
struct x s;
s.a = 3;
s.b = 5;
printf("0x%02X\n", *((char*)&s) );
输出可能是任何一个0x03
,0x05
,0x16
或者甚至是0x25
。
我希望看到的是0x16
...
在我看来,当传输位域时,你应该始终手动构建已知状态。
uint8_t buf[];
buf[x] = 0;
buf[x] |= (s.a) & 0x03;
buf[x] |= (s.b << 2) & 0x1C;
struct s { int x; char y; };
在大多数系统上使用8个字节。 - Dietrich Eppint ab=a<<11+b
。 - H_squareda
和b
打包到一个32位实体中?如果连续的字段完全适合,则C标准要求将它们打包到实现正在使用的任何单元中。 (如果它们不适合,则标准允许在一个单元中部分地放置字段并在下一个单元中留下未使用的位或离开位。) - Eric Postpischil