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

1f431213a0367508ca989ac094738c37.png

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

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

a68644692cee2be8ddd7f99e62abf6ad.png

1.嵌入式还有哪些风口值得入?

2.STM32和Arduino对比,谁更厉害?

3.嵌入式模块化编程、驱动分离的重要性

4.用CH573实现自拍杆蓝牙遥控器

5.带你一步一步理解C语言指针!

6.欧洲处理器项目第一阶段完成:29个RISC-V内核

23a5399f1dcc2bcc2dd72f11fe375e1e.gif

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值