#include <stdio.h>
//#define _TEST // 切换显示不同结构体排列,内存空间占用情况
//----------------------联合体定义----------------------
typedef union
{
unsigned char uiVal; // 联合体的大小是1Byte
struct
{
unsigned char bit0 :1;
unsigned char bit1 :1;
unsigned char bit2 :1;
unsigned char bit3 :1;
unsigned char bit4 :1;
unsigned char bit5 :1;
unsigned char bit6 :1;
unsigned char bit7 :1;
}Byte;
}MyUnion;
//----------------------结构体定义----------------------
typedef struct
{
#ifdef _TEST
// 变量排列顺序1
// 对于 Data0 先开辟一个 4Byte空间 但是它本身只占用了 1Byte 剩余3Byte
// 然后 Data1 试图去紧挨着 Data0 存放 但是发现只能存放3Byte 还有1Byte没地方存放,所以它再次开辟4Byte空间来存放自己
// 最后 Data2 发现 Data1 已经独占了 4Byte空间 自己也重新开辟 4Byte空间
// 因此,总共占用空间为 4+4+4 = 12Byte
// 其中第一个 4Byte空间只存放了 1Byte的变量 其余3Byte闲置
// 第三个4Byte空间也值存放了2Byte 闲置2Byte
unsigned char Data0; // 1Byte
unsigned int Data1; // 4Byte
unsigned short int Data2; // 2Byte
#else
// 变量排列顺序2
// 对于 Data0 先开辟一个 4Byte空间 但是它本身只占用了 1Byte 剩余3Byte
// 然后 Data1 发现 Data0 开辟的4Byte空间还有3Byte是空的 而自己本身只需要2Byte空间就够了 所以就紧挨着 Data0 存放
// 最后 Data2 发现 Data0 Data1 在第一个4Byte空间中已经用去了3Byte 仅剩1Byte空间 而自己需要4Byte空间 所以需要重新开辟 4Byte空间
// 因此,总共占用空间为 4+4 = 8Byte
// 其中第一个 4Byte空间只存放了 3Byte的变量 其余1Byte闲置
unsigned char Data0; // 1Byte
unsigned short int Data1; // 2Byte
unsigned int Data2; // 4Byte
#endif
}RECORD;
//----------------------用户变量----------------------
MyUnion DataVal;
RECORD m_Record; // 统计数据
//----------------------主函数----------------------
void main()
{
//----------------------
DataVal.uiVal = 0x79;
printf("sizeof_MyUnion = %d Byte \n\n",sizeof(DataVal.uiVal));
printf("DataVal.Byte.bit7 = %d \n",DataVal.Byte.bit7);
printf("DataVal.Byte.bit6 = %d \n",DataVal.Byte.bit6);
printf("DataVal.Byte.bit5 = %d \n",DataVal.Byte.bit5);
printf("DataVal.Byte.bit4 = %d \n",DataVal.Byte.bit4);
printf("DataVal.Byte.bit3 = %d \n",DataVal.Byte.bit3);
printf("DataVal.Byte.bit2 = %d \n",DataVal.Byte.bit2);
printf("DataVal.Byte.bit1 = %d \n",DataVal.Byte.bit1);
printf("DataVal.Byte.bit0 = %d \n\n\n",DataVal.Byte.bit0);
//----------------------
m_Record.Data0 = 0x12;
m_Record.Data1 = 0x34;
m_Record.Data2 = 0x56;
printf("sizeof_m_Record.Data0 = %d \n",sizeof(m_Record.Data0));
printf("sizeof_m_Record.Data1 = %d \n",sizeof(m_Record.Data1));
printf("sizeof_m_Record.Data2 = %d \n",sizeof(m_Record.Data2));
printf("sizeof_m_Record = %d Byte \n",sizeof(m_Record));
}