美文网首页单片机学习玩转51单片机每天一点单片机知识
8位单片机中对16位int型数据的操作技巧

8位单片机中对16位int型数据的操作技巧

作者: 创客乌托邦 | 来源:发表于2017-12-22 01:01 被阅读35次

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

    unsigned char a = 0x12;
    unsigned char b = 0x34;
    unsigned int c = 0;
    

    如何把两个8位数据和在一起变成16位数据呢?
    一般情况下大家都会这样做,我最初是也是这么做的

    方法1 【使用移位指令】

     int c = (a<<8)|b;
    

    方法2 【使用指针】

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

    方法3 【强制指针类型转换】

    *((unsigned char*)(&d)) = a;
    *((unsigned char*)(&d)+1) = b;
    或
    ((unsigned char*)(&d))[0] = a;
    ((unsigned char*)(&d))[1] = b;
    

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

    typedef union{
    unsigned int i;
    unsigned char c[2];
    }u_int;
    unsigned char dH = 0x11, dL=0x22;
    unsigned int d;
    u_int ud;
    ud.c[0] = dH;
    ud.c[1] = dL;
    d = ud.i;
    

    此时d = 0x1122;

    这里就是利用了联合体union的特性来实现把两个8位数据合并成一个16位数据的方法。在C语言里操作指针最容易出现错误,所以在遇到这样类似的问题大家不妨使用联合体的方式进行处理数据,既不容易出现错误,生成的代码又简洁。
    如果不明白联合体union用法的同学,去问问百度吧。

    相关文章

      网友评论

      • XY_QL:例2指针有点难度
        XY_QL:@风趣美文 二级指针一般比较少吧 有时候不懂什么时候应该用指针:stuck_out_tongue_closed_eyes:
        创客乌托邦:如果你要是刚接触,或者不怎么用 确实有难的感觉,有点驾驭不了的感觉。不过你经常使用,在使用的过程中经常思考 指针的使用方法,慢慢的觉得也就不太难啦。

      本文标题:8位单片机中对16位int型数据的操作技巧

      本文链接:https://www.haomeiwen.com/subject/cagzwxtx.html