2020/2/22 如何用一个结构体union来表示一个32位数
#include <stdio.h>
typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned int u32;
//------------报错信息表
typedef union Inverter_FaultMessage_t
{
u32 ALL;
struct
{
u16 BYTE0 : 8;
u16 BYTE1 : 8;
u16 BYTE2 : 8;
u16 BYTE3 : 8;
} BYTE;
struct
{
u16 WORD0 : 16;
u16 WORD1 : 16;
} WORD;
struct
{
//BYTE0
u16 bit0 : 1; //trip zone err
u16 bit1 : 1; //Mains lost
u16 bit2 : 1; //OVP/UVP
u16 bit3 : 1; //OFP/UFP
u16 bit4 : 1; //PLL unlocked
u16 bit5 : 1;
u16 bit6 : 1; //Boost_OCP_Fault
u16 bit7 : 1;
//BYTE1
u16 bit8 : 1;
u16 bit9 : 1;
u16 bit10 : 1;
u16 bit11 : 1;
u16 bit12 : 1;
u16 bit13 : 1;
u16 bit14 : 1;
u16 bit15 : 1;
//BYTE2
u16 bit16 : 1; //internal comms err
u16 bit17 : 1; //rs232(dbgu) comms err
u16 bit18 : 1; //interface comms err
u16 bit19 : 1;
u16 bit20 : 1;
u16 bit21 : 1;
u16 bit22 : 1;
u16 bit23 : 1;
//BYTE3
u16 bit24 : 1;
u16 bit25 : 1;
u16 bit26 : 1;
u16 bit27 : 1;
u16 bit28 : 1;
u16 bit29 : 1;
u16 bit30 : 1;
u16 bit31 : 1;
} BIT;
} Inverter_FaultMessage_t;
Inverter_FaultMessage_t Inverter_Fault;
int main()
{
// Inverter_Fault.BYTE.BYTE0 = 0x12;
// Inverter_Fault.BYTE.BYTE1 = 0x34;
// Inverter_Fault.BYTE.BYTE2 = 0x56;
// Inverter_Fault.BYTE.BYTE3 = 0x78; //结果 78563412 (byte3 << 24) | (byte2 << 16) | (byte1 << 8) | byte0
// Inverter_Fault.WORD.WORD0 = 0x1234;
// Inverter_Fault.WORD.WORD1 = 0x5678; //结果 56781234 (WORD1 << 16) | WORD0
Inverter_Fault.BIT.bit0 = 1;
Inverter_Fault.BIT.bit3 = 1;
Inverter_Fault.BIT.bit28 = 1;
Inverter_Fault.BIT.bit29 = 0;
Inverter_Fault.BIT.bit30 = 1;
Inverter_Fault.BIT.bit31 = 1;
printf("%x \n", Inverter_Fault.ALL ); //结果 d0000009
}