1. STRUCT里面的总长度大于UNION中的最大长度
在UNION类型中,嵌套如STRUCT类型,其中STRUCT的类型还比UNION类型中最大的类型的长度还长的时候,会如何处理呢,看下面示例
程序源码
#include "stdafx.h"
typedef unsigned long ULONG;
typedef unsigned char UCHAR;
typedef void *HANDLE;
typedef struct
{
ULONG f_data1;
UCHAR f_data2;
union
{
ULONG s_data1;
UCHAR s_data2;
struct
{
ULONG s_Value1;
ULONG s_Value2;
}data_second;
}u;
}DATA_FIRST;
int _tmain(int argc, _TCHAR* argv[])
{
DATA_FIRST d1;
d1.f_data1 = 0x11111111;
d1.f_data2 = 0x23;
d1.u.s_data1 = 0x44444444;
d1.u.s_data2 = 0x56;
d1.u.data_second.s_Value1 = 0x789a;
d1.u.data_second.s_Value2 = 0x88888888;
printf("Print data: \n");
printf("\t d1.f_data1 = 0x%X \n", d1.f_data1);
printf("\t d1.f_data2 = 0x%X \n", d1.f_data2);
printf("\t d1.u.s_data1 = 0x%X \n", d1.u.s_data1);
printf("\t d1.u.s_data2 = 0x%X \n", d1.u.s_data2);
printf("\t d1.u.data_second.s_Value1 = 0x%X \n", d1.u.data_second.s_Value1);
printf("\t d1.u.data_second.s_Value2 = 0x%X \n", d1.u.data_second.s_Value2);
return 0;
}
运行结果
源码分析
2. TRUCT里面的总长度小于等于UNION中的最大长度
在UNION类型中,嵌套如STRUCT类型,其中STRUCT的类型比UNION类型中最大的类型的长度还小时候,会如何处理呢,看下面示例
程序源码
#include "stdafx.h"
typedef unsigned long ULONG;
typedef unsigned char UCHAR;
typedef void *HANDLE;
typedef struct
{
ULONG data1;
union
{
ULONG data2;
UCHAR data3;
struct
{
ULONG value1: 4;
ULONG value2 : 4;
ULONG value3 : 4;
ULONG value4 : 4;
ULONG value5 : 4;
ULONG value6 : 4;
ULONG value7 : 4;
ULONG value8 : 4;
}value;
}u;
}DATA_FIRST;
int _tmain(int argc, _TCHAR* argv[])
{
DATA_FIRST d;
d.data1 = 0x11112222;
d.u.data2 = 0x22334455;
d.u.data3 = 0xaa;
d.u.value.value5 = 0xb;
printf("Print data: \n");
printf("\t d.data1 = 0x%X \n", d.data1);
printf("\t d.u.data2 = 0x%X \n", d.u.data2);
printf("\t d.u.data3 = 0x%X \n", d.u.data3);
printf("\t d.u.value.value1 = 0x%X \n", d.u.value.value1);
printf("\t d.u.value.value2 = 0x%X \n", d.u.value.value2);
printf("\t d.u.value.value3 = 0x%X \n", d.u.value.value3);
printf("\t d.u.value.value4 = 0x%X \n", d.u.value.value4);
printf("\t d.u.value.value5 = 0x%X \n", d.u.value.value5);
printf("\t d.u.value.value6 = 0x%X \n", d.u.value.value6);
printf("\t d.u.value.value7 = 0x%X \n", d.u.value.value7);
printf("\t d.u.value.value8 = 0x%X \n", d.u.value.value8);
return 0;
}
运行结果:
源码分析: