
在入門單片機時,想必大家都會遇到以下這種情況:
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語言里,操作指針最容易出現錯誤,所以在遇到這類問題時,大家不妨使用聯合體的方式進行處理數據,既不容易出現錯誤,生成的代碼又很簡潔。