寫單片機程序數(shù)據(jù)類型相關(guān)
最近在調(diào)試單片機程序,總是遇到一些開始認為不可思議的事情,后來解決了問題后發(fā)現(xiàn),都是因為自己書寫程序不嚴謹,其主要原因是沒有注意c語言的數(shù)據(jù)類型的數(shù)據(jù)范圍。
對有符號、無符號數(shù)據(jù)的使用存在誤區(qū),對類型轉(zhuǎn)換理解不到位。下面就舉例一一說明:
1:一個簡單的for循環(huán),但因為數(shù)據(jù)溢出導(dǎo)致進入死循環(huán),無法實現(xiàn)相應(yīng)功能。
unsigned char i;
for(i=0;i<256;i++)
語句;
咋看起來這語句沒有什么問題。但仔細考慮發(fā)現(xiàn),i在此循環(huán)中會溢出,i的值 0---255---0----255----0-----------。
2:在循環(huán)里還需要注意的是有符號數(shù)和無符號數(shù)進行比較時:
unsigned char i;
i=230;
if(i>-5)
當無符號和有符號數(shù)進行比較時,會把無符號數(shù)轉(zhuǎn)換為有符號數(shù),i=230轉(zhuǎn)換成有符號數(shù)是-26 因此if條件不成立。
3:使用printf或sprintf時,注意要打印的數(shù)值的數(shù)據(jù)類型,否則打印出來的不是你需要的。
4:注意在各個函數(shù)參數(shù)或者其他賦值時的數(shù)據(jù)類型的默認轉(zhuǎn)換??紤]清楚的類型不匹配時,和默認類型轉(zhuǎn)換不符時,可以使用強制類型轉(zhuǎn)換。
5:昨天調(diào)試一個單片機漢字顯示程序時,遇到數(shù)據(jù)簡單運算結(jié)果不對的情況。
uchar ch0,ch1;
uint32offset;
offset=(uint32) (HZ_BASE_ADDR+((((ch0 - 1) * 94) + (ch1 - 1))*32)); 這個語句算出的結(jié)果不對,開始不理解,后來發(fā)現(xiàn)還是數(shù)據(jù)類型的問題。原因是ch0是無符號字符類型的,因此((ch0 - 1) * 94) 的結(jié)果溢出。導(dǎo)致出錯。修正方案:offset=(uint32) (HZ_BASE_ADDR+((((ch0 - 1) * 94L) + (ch1 - 1))*32L)); 添加強制轉(zhuǎn)換,把立即數(shù)強制為long int型數(shù)據(jù),根據(jù)c語言默認數(shù)據(jù)類型提升方案,其他參與運算的數(shù)值也轉(zhuǎn)換為long int型。問題解決。