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 <stdio.h>

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)共享同一块内存空间

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,将一组8位数据转换为16数组可以通过如下的方法实现。 首先,我们需要声明一个8位数据数组并初始化数据,假设这个数组名为data_8bits,并有8个元素。 接下来,声明一个16数组,并给它分配足够的空间存储转换后的数据,假设这个数组名为data_16bits,并有16个元素。 然后,我们可以使用一个循环遍历8位数据数组,并将每个元素的值赋给16数据数组的相应置。为了实现这个过程,我们可以使用运算符来将8位数据的低8位字节(data_8bits[i])先左移8位,然后与8位数据的高8位字节(data_8bits[i+1])进行逻辑或操作,生16数据中的一个元素。为了保证正确性,在进行运算之前,需要确保数据的排列顺序是正确的。 具体代码示例如下: ```c #include <stdio.h> int main() { unsigned char data_8bits[] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0}; unsigned short data_16bits[16]; for (int i = 0; i < 8; i++) { data_16bits[i] = (data_8bits[i] << 8) | data_8bits[i + 1]; } // 打印转换后的16数组 for (int i = 0; i < 16; i++) { printf("data_16bits[%d]: %x\n", i, data_16bits[i]); } return 0; } ``` 上述代码将8位数据数组中的每两个相邻元素合并为一个16数据数组中的一个元素,并通过循环打印出转换后的16数组。注意,由于16数据数组16个元素,而8位数据数组只有8个元素,因此在访问8位数据数组中的第9个元素时需要注意边界条件的判断,避免数组越界。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值