联合结构中的位域
Bit-fields in union in structure
我有这两个结构:-
1.
typedef struct bitfield
{
unsigned int a:16;
unsigned int b:17;
union
{
unsigned int c:4;
unsigned int d:32;
};
}bfield;
这个结构有匿名联合,当我计算这个结构的大小时 - 结果是 12 个字节 (4+4+4)。这个不错。
2.
typedef struct bitfield
{
unsigned int a:16;
unsigned int b:17;
union u
{
unsigned int c:4;
unsigned int d:32;
};
}bfield;
但是我在 32 位机器上的 DevC++ 编译器针对这个结构的大小打印了 8 个字节。不明白为什么会变成8
您的第一个示例声明了一个具有匿名 union
.
的结构
第二个示例声明了一个结构,其中包含 union
的声明,这是一个空操作。例如
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 的要求执行)。
它看起来只是联合声明,并没有向结构中添加字段。
将联合字段声明为匿名或命名。
请看这个例子(也张贴在这里:http://rextester.com/EPUEH77041)
在这两种情况下,结构的大小都是 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";
}
我有这两个结构:- 1.
typedef struct bitfield
{
unsigned int a:16;
unsigned int b:17;
union
{
unsigned int c:4;
unsigned int d:32;
};
}bfield;
这个结构有匿名联合,当我计算这个结构的大小时 - 结果是 12 个字节 (4+4+4)。这个不错。
2.
typedef struct bitfield
{
unsigned int a:16;
unsigned int b:17;
union u
{
unsigned int c:4;
unsigned int d:32;
};
}bfield;
但是我在 32 位机器上的 DevC++ 编译器针对这个结构的大小打印了 8 个字节。不明白为什么会变成8
您的第一个示例声明了一个具有匿名 union
.
第二个示例声明了一个结构,其中包含 union
的声明,这是一个空操作。例如
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 的要求执行)。
它看起来只是联合声明,并没有向结构中添加字段。
将联合字段声明为匿名或命名。
请看这个例子(也张贴在这里:http://rextester.com/EPUEH77041)
在这两种情况下,结构的大小都是 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";
}