单片机c语言强制数据类型,写单片机程序数据类型相关
最近在調試單片機程序,總是遇到一些開始認為不可思議的事情,后來解決了問題后發現,都是因為自己書寫程序不嚴謹,其主要原因是沒有注意c語言的數據類型的數據范圍。
對有符號、無符號數據的使用存在誤區,對類型轉換理解不到位。下面就舉例一一說明:
1:一個簡單的for循環,但因為數據溢出導致進入死循環,無法實現相應功能。
unsigned char i;
for(i=0;i<256;i++)
語句;
咋看起來這語句沒有什么問題。但仔細考慮發現,i在此循環中會溢出,i的值 0---255---0----255----0-----------。
2:在循環里還需要注意的是有符號數和無符號數進行比較時:
unsigned char i;
i=230;
if(i>-5)
當無符號和有符號數進行比較時,會把無符號數轉換為有符號數,i=230轉換成有符號數是-26 因此if條件不成立。
3:使用printf或sprintf時,注意要打印的數值的數據類型,否則打印出來的不是你需要的。
4:注意在各個函數參數或者其他賦值時的數據類型的默認轉換??紤]清楚的類型不匹配時,和默認類型轉換不符時,可以使用強制類型轉換。
5:昨天調試一個單片機漢字顯示程序時,遇到數據簡單運算結果不對的情況。
uchar ch0,ch1;
uint32offset;
offset=(uint32) (HZ_BASE_ADDR+((((ch0 - 1) * 94) + (ch1 - 1))*32)); 這個語句算出的結果不對,開始不理解,后來發現還是數據類型的問題。原因是ch0是無符號字符類型的,因此((ch0 - 1) * 94) 的結果溢出。導致出錯。修正方案:offset=(uint32) (HZ_BASE_ADDR+((((ch0 - 1) * 94L) + (ch1 - 1))*32L)); 添加強制轉換,把立即數強制為long int型數據,根據c語言默認數據類型提升方案,其他參與運算的數值也轉換為long int型。問題解決。
總結
以上是生活随笔為你收集整理的单片机c语言强制数据类型,写单片机程序数据类型相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快手推出短视频产品快手推出短视频产品是什
- 下一篇: android studio编译找不到程