在8位單片機中對16位INT型數(shù)據(jù)的操作
(1)使用聯(lián)合 (union)
typedef union{
}u_int;
u_int ud;
ud.c[0] = dH;
ud.c[1] = dL;
d = ud.i;
此時d = 0x1122;
(2) 使用移位指令
數(shù)據(jù)定義與前面相同
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)強制指針類型轉(zhuǎn)換
*((unsigned char*)(&d)) = dH;
*((unsigned char*)(&d)+1) = dL;
或
((unsigned char*)(&d))[0] = dH;
((unsigned char*)(&d))[1] = dL;
這兩種方式看似相同但由Keil編譯出的代碼是不用的,前都有一次加法運算,而后者沒有,后者生成的代碼更簡潔,這種方式與用聯(lián)合成生的代碼是完全一樣的,
在這幾種方法中第(1)與第(4)的第二種生成的代碼是最乘潔的,是推薦使用的,從軟件工程的角度出發(fā),推薦使用方法(1),這樣沒有強制類型轉(zhuǎn)換,沒有用到指針,更不容易出錯。從書寫的代碼來講,第(4)的第二種方法是最好的,代碼簡潔而且效率最高,但語法有點兒復(fù)雜。
評論