C 结构中并集的位字段
我有以下两种结构:- 1. 这个结构有匿名联合,当我计算这个结构的大小时,它是12个字节(4+4+4)。这很好 二,C 结构中并集的位字段,c,bit-fields,C,Bit Fields,我有以下两种结构:- 1. 这个结构有匿名联合,当我计算这个结构的大小时,它是12个字节(4+4+4)。这很好 二, 但是,我的32位机器上的DevC++编译器会根据这个结构的大小打印8个字节。我不明白为什么结果是8。您的第一个示例声明了一个具有匿名联合的结构 第二个示例声明了一个结构,其中包含联合的声明,即noop。例如 typedef struct bitfield { unsigned int a:16; unsigned int b:17; union u
但是,我的32位机器上的DevC++编译器会根据这个结构的大小打印8个字节。我不明白为什么结果是8。您的第一个示例声明了一个具有匿名
联合的结构
第二个示例声明了一个结构,其中包含联合的声明,即noop。例如
typedef struct bitfield
{
unsigned int a:16;
unsigned int b:17;
union u
{
unsigned int c:4;
unsigned int d:32;
};
}bfield;
int main(void) {
struct bitfield b;
b.c=2;
}
将以失败告终
x.c:14:4: error: 'struct bitfield' has no member named 'c'
编译器可能会使用
x.c:9:6: warning: declaration does not declare anything
因此,您的问题与位字段无关,与匿名联合无关。OP中的联合声明不正确(它不符合OP的要求)
它看起来只是一个联合声明,并不向结构中添加字段
将联合字段声明为匿名或命名
请看这个例子(也张贴在这里:)
在这两种情况下,struct的大小都是12字节
#include <iostream>
typedef struct bitfield
{
unsigned int a:16;
unsigned int b:17;
union u
{
unsigned int c:4;
unsigned int d:32;
}U;
}bfield;
typedef struct bitfield2
{
unsigned int a:16;
unsigned int b:17;
union
{
unsigned int c:4;
unsigned int d:32;
};
}bfield2;
int main()
{
std::cout << "Test bitfields1\n" << sizeof(bfield) << "\n";
std::cout << "Test bitfields2\n" << sizeof(bfield2) << "\n";
static volatile bfield y;
y.a=0x1234;
y.b = 0x1FF55;
y.U.d = 0x5a5a5a5a;
std::cout << std::hex << y.U.d << "\n";
static volatile bfield2 x;
x.a=0x1234;
x.b = 0x1FF55;
x.d = 0x5a5a5a5a;
std::cout << std::hex << x.d << "\n";
}
#包括
typedef结构位字段
{
无符号整数a:16;
无符号整数b:17;
联合大学
{
无符号整数c:4;
无符号整数d:32;
}U;
}贝菲尔德;
类型定义结构位字段2
{
无符号整数a:16;
无符号整数b:17;
联盟
{
无符号整数c:4;
无符号整数d:32;
};
}bfield2;
int main()
{
std::难道几乎不能保证位字段的布局。他说:如果32位无符号的struct
的字节宽度超过8位,则只能有8个字节。请提供一个。假设为8位/字节,那么struct
的大小很可能是16个字节。但这一切都取决于平台。@Olaf deunsigned的错误宽度是不相关的,因为他/她已经手动指定了每个字段的位宽度。但是我同意不能将其压缩为8个字节。看看编译器正在生成什么代码会很有趣。@jforberg:你怎么能得到相同的结果,因为我们甚至不知道OP使用的代码?@Olaf:我不知道理解你的意思。OP是问为什么在流行的Intel 32平台上使用流行的GCC编译器时会发生这种情况。这是一个完全正确的问题。如果你不知道为什么,那没关系,但请不要告诉我“去阅读标准”。或者假设我在回答之前没有阅读你的评论。或者暗示任何“其他代码”该OP可能会更改以前定义的结构的大小,这显然是错误的。@Olaf说他正在使用Dev-C++,一个使用GCC(mingw)的IDE而且只在Windows上运行。他还说他的机器是32位的。所以我认为从这一点假设他的平台是安全的,但显然这还不足以满足stack overflow的语言律师。无论如何,我认为我们已经花了足够多的时间相互交谈。祝你好运……接下来,你可能是有意的把u
放在块的后面,而不是前面,这样你就得到了union{uint c;uint d}u
,实际上它是匿名的union
而不是union的声明,而不仅仅是匿名的union
(或结构体
)@HaldeanBrown:那将使u
不再是一个匿名的union
。不确定这是否是OP想要的。啊,当然。我假设s/他想取消它的名字,因为他们正在添加额外的标记。
x.c:9:6: warning: declaration does not declare anything
#include <iostream>
typedef struct bitfield
{
unsigned int a:16;
unsigned int b:17;
union u
{
unsigned int c:4;
unsigned int d:32;
}U;
}bfield;
typedef struct bitfield2
{
unsigned int a:16;
unsigned int b:17;
union
{
unsigned int c:4;
unsigned int d:32;
};
}bfield2;
int main()
{
std::cout << "Test bitfields1\n" << sizeof(bfield) << "\n";
std::cout << "Test bitfields2\n" << sizeof(bfield2) << "\n";
static volatile bfield y;
y.a=0x1234;
y.b = 0x1FF55;
y.U.d = 0x5a5a5a5a;
std::cout << std::hex << y.U.d << "\n";
static volatile bfield2 x;
x.a=0x1234;
x.b = 0x1FF55;
x.d = 0x5a5a5a5a;
std::cout << std::hex << x.d << "\n";
}