zoukankan      html  css  js  c++  java
  • 8bit数据 转换为 16bit数据的四种方法

    【转】玩转嵌入式(公众号)

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

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

    测试代码

     1 #include "stdio.h"
     2 
     3 typedef unsigned char     uint8_t;
     4 typedef unsigned short    uint16_t;
     5 typedef unsigned int      uint32_t;
     6 
     7 
     8 uint8_t a = 0x12;
     9 uint8_t b = 0x34;
    10 uint16_t c;
    11 
    12 /* 使用移位转换类型 */
    13 void use_shift(uint16_t *val) 
    14 {
    15     *val = (a<<8) | b;
    16 }
    17 
    18 /* 使用指针转换类型 */
    19 void use_point(uint16_t *val)
    20 {
    21     uint8_t *p;
    22     
    23     p = (uint8_t *)val; 
    24     p[0] = b;
    25     p[1] = a;
    26 }
    27 
    28 /* 强制指针转换类型 */
    29 void  force_point_convert(uint16_t *val)
    30 {
    31 #if 0
    32     *((uint8_t *)val) = b;
    33     *((uint8_t *)val + 1) = a;
    34 #else
    35     ((uint8_t *)val)[0] = b;
    36     ((uint8_t *)val)[1] = a;
    37 #endif
    38 }
    39 
    40 /* 使用共用体转换类型 */
    41 typedef union
    42 {
    43     uint16_t int16;
    44     uint8_t char8[2];
    45 } CVR_u;
    46 CVR_u Obj;
    47 
    48 void use_union(CVR_u *p)
    49 {
    50     p->char8[0] = b;
    51     p->char8[1] = a;
    52 }
    53 
    54 int main(void)
    55 {    
    56     c = 0;
    57     use_shift(&c);
    58     printf("c1= %#X
    ", c);
    59     
    60     c = 0;
    61     use_point(&c);
    62     printf("c2= %#X
    ", c);
    63     
    64     c = 0;
    65     force_point_convert(&c);
    66     printf("c3= %#X
    ", c);
    67     
    68     c = 0;
    69     use_union(&Obj);
    70     c = Obj.int16;
    71     printf("c4= %#X
    ", c);
    72     
    73     return 0;
    74 }
  • 相关阅读:
    leecode 91. 解码方法
    leecode 166. 分数到小数
    剑指 Offer 31. 栈的压入、弹出序列
    leecode 386. 字典序排数
    LeetCode 311 稀疏矩阵的乘法
    leecode 89. 格雷编码
    leecode 79. 单词搜索
    leecode 207. 课程表
    QT -- 解决:Error: Could not decode "*.cpp" with "UTF-8"
    VS+QT -- 没有PRO文件的问题
  • 原文地址:https://www.cnblogs.com/skullboyer/p/8134199.html
Copyright © 2011-2022 走看看