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

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

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用法的同学,去问问百度吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容