在8位单片机中没有16位数的操作指令,一切的int型数据都要经过两个字节分隔操作,运用的办法不必,生成的代码也不相同,当然功率也不相同,经过指针对16位数进行操作能够得到高效的代码。
(1)运用联合 (union)
typedef union{
}u_int;
u_int ud;
ud.c[0] = dH;
ud.c[1] = dL;
d = ud.i;
此刻d = 0x1122;
(2) 运用移位指令
数据界说与前面相同
d = ((unsigned int)dH)<<8 +
或许
d = dH;
d <<= 8;
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)的第二种办法是最好的,代码简练并且功率最高,但语法有点儿杂乱。