對於從事單片機開發,進行單片機c語言開發的人來講,在對外部信息採集回來的數據進行處理,常常會用到,將採集到的第一個字節做爲高8位,採集到的第二個字節做爲低8位,從而構成1個16bit的數,獲得一次完整的數據。那麼如何來實現呢。html
方法1:ide
比較廣泛的作法是經過移位思想,函數
eg:spa
void get_data(u16 *p);
指針
void main()orm
{htm
u16 data;blog
get_data(&data);開發
}get
void get_data(u16 *p)
{
u8 buf[2];
u16 temp;
buf[0]=s_read();
buf[1]=s_read();
temp=buf[0]<<8+buf[1];
*p=temp;
}
【注:上面的數據類型定義是採用STM32中的數據類型來定義的,不是標準C,上面程序這樣寫主要是與下面的造成對比】
方法2:經過指針來實現
指針變量做爲函數參數,這樣在函數中修改實參所對應的地址中存放的數,【經過指針修改實參指針變量所指的值】
eg.
void get_data(u8 *p);
void main()
{
u16 data;
get_data((u8)&data);
}
void get_data(u8 *p)
{
*p=s_read();
*(p+1)=s_read();
}
這樣咱們分析一下,因爲u16佔用兩個字節,u8佔用1字節,這樣形參p中存放的地址和實參&data是相同的,
咱們經過對p地址,p+1地址中賦值,從而對實參&data地址進行了賦值。
這就是經過指針實現題目的要求。
可是有個問題,方法二和方法一獲得的結果同樣嗎?
這裏就有了字節序的概念,即低地址中存放高位,仍是地址中存放高位。
即大端模式和小端模式。能夠參考這篇文章 大端模式和小端模式參考
PC機是小端模式,因此上述兩種方法獲得的結果不一致。
單片機:51單片機是大端模式,上訴結果一致,
stm32是小端模式,上述兩種方法結果不一致。
因此須要根據具體的處理器是大端模式,仍是小端模式來進行處理。