您的位置 首页 技术

在8位单片机中对16位INT型数据的操作

在8位单片机中没有16位数的操作指令,所有的int型数据都要通过两个字节分开操作,使用的方法不用,生成的代码也不相同,当然效率也不一样,

在8位单片机中没有16位数的操作指令,一切的int型数据都要经过两个字节分隔操作,运用的办法不必,生成的代码也不相同,当然功率也不相同,经过指针对16位数进行操作能够得到高效的代码。

比方经过串行口接纳数据,或许从串行的EEPROM中读取的数据,或许从大于8位的A/D读取的数据,因为8位单片机的数据线是8位的,高于8位的数据都要分红两个字节别离读取,然后写入到RAM中去再进行核算,或许把16位的int型数据从RAM中读出再别离把凹凸字节存到EEPROM或许送到D/A,或许经过串行口发送出去,办法有很多种,下面用多种办法进行完成该操作,这儿只演示写入到16位的状况,读取的状况十分类似,不赘述。
(1)运用联合 (union)
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;
(2) 运用移位指令
数据界说与前面相同
d = ((unsigned int)dH)<<8 + dL;
或许
d = dH;
d <<= 8; // or: d = d<<8; 但后者编译的代码或许不是最简的
d |= dL; // or: d = d | dL; 后者编译的代码或许不是最简的
(3)运用指针
unsigned char *cptr;
cptr = (unsigned char*)(&d);
cptr[0] = dH;
cptr[1] = dL;
(4)强制指针类型转化
*((unsigned char*)(&d)) = dH;
*((unsigned char*)(&d)+1) = dL;

((unsigned char*)(&d))[0] = dH;
((unsigned char*)(&d))[1] = dL;
这两种办法看似相同但由Keil编译出的代码是不必的,前都有一次加法运算,而后者没有,后者生成的代码更简练,这种办法与用联组成生的代码是彻底相同的,
在这几种办法中第(1)与第(4)的第二种生成的代码是最乘洁的,是引荐运用的,从软件工程的视点动身,引荐运用办法(1),这样没有强制类型转化,没有用到指针,更不简单犯错。从书写的代码来讲,第(4)的第二种办法是最好的,代码简练并且功率最高,但语法有点儿杂乱。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/261965.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部