字段并集和结构并集之间的区别
difference between union of fields and union of structures
我正在定义一组结构来处理一些寄存器,当我定义这些结构时,我发现定义简单字段的联合和结构的联合之间存在差异。我不确定为什么会出现这种差异:
#include <iostream>
using namespace std;
typedef union
{
uint16_t all_bits;
struct
{
uint16_t a:4, b:4, c:4, d:3, e:1;
};
}
Example1_t;
typedef union
{
uint16_t all_bits;
uint16_t a:4, b:4, c:4, d:3, e:1;
}
Example2_t;
int
main ()
{
Example1_t example1;
Example2_t example2;
example1.all_bits = 0x8BCD;
example2.all_bits = 0x8BCD;
cout << "a " << std::hex << example1.a << " " << example2.a << std::endl;
cout << "b " << std::hex << example1.b << " " << example2.b << std::endl;
cout << "c " << std::hex << example1.c << " " << example2.c << std::endl;
cout << "d " << std::hex << example1.d << " " << example2.d << std::endl;
cout << "e " << std::hex << example1.e << " " << example2.e << std::endl;
return 0;
}
输出:
a d d
b c d
c b d
d 0 5
1 1
迂腐的回答是:
您的代码有未定义的行为。写入联合字段并从另一个字段读取不能保证有效,因此您看到的任何不一致都可以作为 "broken code".
处理掉
实际上,很多人都依赖这个 "broken behavior" 是一致的,所有现代编译器仍然在这里提供可预测的功能(以忽略一些为代价优化机会)。所以在你的代码中确实有一些特定的东西让它按照它的方式运行:
在Example1_t
中,联合有两个重叠字段:all_bits
和结构。在该结构中,每个成员都有不同的存储空间。
在Example2_t
中,a
、b
、c
、d
和e
都是union的独立字段,所以它们都有重叠的存储空间。
我正在定义一组结构来处理一些寄存器,当我定义这些结构时,我发现定义简单字段的联合和结构的联合之间存在差异。我不确定为什么会出现这种差异:
#include <iostream>
using namespace std;
typedef union
{
uint16_t all_bits;
struct
{
uint16_t a:4, b:4, c:4, d:3, e:1;
};
}
Example1_t;
typedef union
{
uint16_t all_bits;
uint16_t a:4, b:4, c:4, d:3, e:1;
}
Example2_t;
int
main ()
{
Example1_t example1;
Example2_t example2;
example1.all_bits = 0x8BCD;
example2.all_bits = 0x8BCD;
cout << "a " << std::hex << example1.a << " " << example2.a << std::endl;
cout << "b " << std::hex << example1.b << " " << example2.b << std::endl;
cout << "c " << std::hex << example1.c << " " << example2.c << std::endl;
cout << "d " << std::hex << example1.d << " " << example2.d << std::endl;
cout << "e " << std::hex << example1.e << " " << example2.e << std::endl;
return 0;
}
输出:
a d d
b c d
c b d
d 0 5
1 1
迂腐的回答是:
您的代码有未定义的行为。写入联合字段并从另一个字段读取不能保证有效,因此您看到的任何不一致都可以作为 "broken code".
处理掉实际上,很多人都依赖这个 "broken behavior" 是一致的,所有现代编译器仍然在这里提供可预测的功能(以忽略一些为代价优化机会)。所以在你的代码中确实有一些特定的东西让它按照它的方式运行:
在Example1_t
中,联合有两个重叠字段:all_bits
和结构。在该结构中,每个成员都有不同的存储空间。
在Example2_t
中,a
、b
、c
、d
和e
都是union的独立字段,所以它们都有重叠的存储空间。