C语言联合体将两个8位数据合成一个16位数据

将一个字节数据合成多字节数据,使用场景不多,但总会遇到

方法一:位移
uint8_t a = 1;
uint8_t b = 2;
int c = (a<<8)|b;
使用指针
uint8_t a = 1;
uint8_t b = 2;
uint16_t d;
unsigned char *cptr;
cptr = (unsigned char*)(&d);
cptr[0] = a;
cptr[1] = b;
使用连接体
#include 

union Data {
    unsigned short int16; // 16位数据
    unsigned char int8[2]; // 8位数据数组
};

int main() {
    union Data data;

    data.int8[0] = 0x12; // 第一个8位数据
    data.int8[1] = 0x34; // 第二个8位数据

    printf("合成后的16位数据为: 0x%04x\n", data.int16);

    return 0;
}

PS:这里我们使用小端字节序,即低位字节存储在低地址中。如果你的系统使用大端字节序,那么你可能需要交换int8[0]和int8[1]的赋值;联合体(union)是C语言中的一种特殊的数据类型,它允许在同一块内存空间中存储不同的数据类型。联合体的大小由其最大的成员决定,所有成员共享同一块内存空间。

扩展

    typedef union {
        unsigned int i;
        unsigned char c[2];

        uint8_t uchar8[4];
        uint32_t uchar32;
    }u_int;

    uint8_t first = 1;
    uint8_t second = 1;

    u_int cover;
    cover.c[0] = first;
    cover.c[1] = second;

    cover.uchar8[0] = 0;
    cover.uchar8[1] = 0;
    cover.uchar8[2] = 2;
    cover.uchar8[3] = 2;

    auto cc = cover.i;	// cc=2

    auto str32 = cover.uchar32;	// str32=0022

即联合体(union)共享同一块内存空间

你可能感兴趣的:(C++/C,c语言)