在入门单片机时,想必大家都都会遇到一下这种情况:

    1. unsigned char a = 0x12;
    2. unsigned char b = 0x34;
    3. unsigned int c = 0;

    如何把两个8位数据和在一起变成16位数据呢?
    一般情况下大家都会这样做:
    方法1 :使用移位指令
    int c = (a<<8)|b;
    方法2 :使用指针

    1. unsigned char *cptr;
    2. cptr = (unsigned char*)(&d);
    3. cptr[0] = a;
    4. cptr[1] = b;

    方法3 :强制指针类型转换

    1. *((unsigned char*)(&d)) = a;
    2. *((unsigned char*)(&d)+1) = b;
    3. or
    4. ((unsigned char*)(&d))[0] = a;
    5. ((unsigned char*)(&d))[1] = b;

    以上这三种方法都是没有错误的,但在keil编译器中编译出的结果是不一样的。第三种方法编译出的代码会更简洁。
    今天就交给大家第4种方法:联合体

    1. typedef union{
    2. unsigned int i;
    3. unsigned char c[2];
    4. }u_int;
    5. unsigned char dH = 0x11, dL=0x22;
    6. unsigned int d;
    7. u_int ud;
    8. ud.c[0] = dH;
    9. ud.c[1] = dL;
    10. d = ud.i;

    | 此时d = 0x1122;

    这里就是利用了联合体union的特性来实现把两个8位数据合并成一个16位数据的方法。

    在C语言里操作指针最容易出现错误,所以在遇到这样类似的问题大家不妨使用联合体的方式进行处理数据,既不容易出现错误,生成的代码又简洁。