在入门单片机时,想必大家都会遇到以下这种情况:
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.嵌入式还有哪些风口值得入?
2.STM32和Arduino对比,谁更厉害?
3.嵌入式模块化编程、驱动分离的重要性
4.用CH573实现自拍杆蓝牙遥控器
5.带你一步一步理解C语言指针!
6.欧洲处理器项目第一阶段完成:29个RISC-V内核
免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。