日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编译器编译16bit单片机程序对数组data[0]=0x12,data[1]=0xBD,data[2]=0x00,data[3]=0x45转换成16进制整数12BD0045的报警

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译器编译16bit单片机程序对数组data[0]=0x12,data[1]=0xBD,data[2]=0x00,data[3]=0x45转换成16进制整数12BD0045的报警 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

16bit單片機程序:

定義32bit一個變量,uint32_t ?decData = 0;

剛開始時在16bit和32bit單片機中都這樣寫:

decData = ( data[0]?<< 24) | (data[1] << 16) | (data[2] << 8 ) | data[3];

問題發現:

編譯16bit單片機程序時,編譯器一直報警,提示數據太大溢出;

編譯32bit單片機程序時,編譯器不報警。

疑問猜測:

16bit單片機不支持這樣的寫法?

查看芯片技術手冊,發現芯片內部有32bit硬件乘法器,

程序改良:

decData = ( data[0]?*2^24) | (data[1]?*2^16) | (data[2]*2^8) |?data[3];

不過這樣寫還得實現一個類似pow功能函數或者直接調用C語言庫函數pow,C語言庫函數的pow都是double參數和字節實現返回值,用著不習慣,自己實現一個pow功能函數,

uint32_t powFunc(uint8_t x,uint8_t power)//n的幾次方
{
? ? if(power == 0)
? ? {
? ? ? ? return 1;
? ? }
? ? if(power == 1)
? ? {
? ? ? ? return x;
? ? }
? ? return x*powFunc(x,power-1);
}

decData = (data[0]*powFunc(2,24)) | (data[1]*powFunc(2,16)) | (data[2]*powFunc(2,8)) | data[3]?;

后來想了想,這樣寫一個函數占內存空間,把上面的代碼再改良,如下:

decData = ( data[0]?*0x1000000UL) | (data[1]*0x10000UL) | (data[2] *0x100UL) | data[3];

或者宏定義:

#define ?SHIFT_LEFT_24BIT ??0x1000000UL

#define ?SHIFT_LEFT_16BIT ??0x10000UL

#define ?SHIFT_LEFT_8BIT ??0x100UL

decData = ( data[0] *?SHIFT_LEFT_24BIT) | (data[1]*SHIFT_LEFT_16BIT) ?| (data[2] *SHIFT_LEFT_8BITL) | data[3];

發現這樣也占內存,不過看著能理解其中的意思,但是考慮到芯片內存比較小,最后退回上一個寫法:

decData = ( data[0]?* 0x1000000UL) |?(data[1] * 0x10000UL) |?(data[2]?* 0x100UL) | data[3];

這樣順利解決了編譯器報警溢出問題,換算出來的數據正常沒有問題。

在32bit單片機程序中,用上面三種方式得到的結果都是一樣的,如下圖所示:

?

總結

以上是生活随笔為你收集整理的编译器编译16bit单片机程序对数组data[0]=0x12,data[1]=0xBD,data[2]=0x00,data[3]=0x45转换成16进制整数12BD0045的报警的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。