如何利用c中的指針實現兩個8bit的數合併爲16bit

如何利用c中的指針實現兩個8bit的數合併爲16bit


對於從事單片機開發,進行單片機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是小端模式,上述兩種方法結果不一致。

因此須要根據具體的處理器是大端模式,仍是小端模式來進行處理。

相關文章
相關標籤/搜索