目錄
- 有符号數和無符号數
- if語句中的判斷A
有符号數和無符号數
假設我們需要定義一個變量用于存放ADC采樣得到的資料,假定門限門檻值是100,低于100的數值認為是噪聲,那麼我們需要如下的代碼來做判斷:
//滿洲裡國峰電子科技
#define THRESHOLD 100
char ADCSamples_1=255;
unsigned char ADCSamples_2=255;
if(ADCSamples_1>THRESHOLD)
printf("ADCSamples_1>THRESHOLD\r\n");
if(ADCSamples_2>THRESHOLD)
printf("ADCSamples_2>THRESHOLD\r\n");
代碼中假設ADC采樣到的數值是255,并分别定義了兩個變量,看一下有符号和無符号變量的影響。運作結果:
ADCSamples_2>THRESHOLD
原因是:有符号數的首位代表符号,char型數值範圍是-128~127,是以255代表-128,是負數,比門檻值100小。這樣的細節在程式設計中要注意,否則會引起判斷錯誤,上例中如果用char型存儲采樣數值,那就會将有用的數值(255)當做噪聲處理(門限門檻值之下認為是噪聲)。
注:為什麼255代表-128而不是-127,因為現代計算機采用補碼運算,正數的補碼是其原碼本身,負數的補碼是反碼+1。
if語句中的判斷A<x<B
在日常的數學表達式中,我們通常使用A<x<B這樣的表達式,但在C語言中卻不是這樣的方式:
//錯誤代碼範例
#define MIN 10
#define MAX 100
unsigned char ADCSample;
ADCSample=GetADCValue();//僞代碼,讀取ADC數值。
if(MIN<ADCSample<MAX)
SaveADCValidSampleToBuff();//在MIN和MAX之間的資料認為是有效資料,存入緩存
//Copyright (C) 滿洲裡國峰電子科技
上述代碼是錯誤的,錯在if語句中的判斷條件,正确的表達如下:
//錯誤代碼範例
#define MIN 10
#define MAX 100
unsigned char ADCSample;
ADCSample=GetADCValue();//僞代碼,讀取ADC數值。
if((MIN<ADCSample)&&(ADCSample<MAX))
SaveADCValidSampleToBuff();//在MIN和MAX之間的資料認為是有效資料,存入緩存
//Copyright (C) 滿洲裡國峰電子科技
數組中備援的元素
有些數組為了滿足不同情況的需求會設定的長度比較大,這樣在某些情況下,該數組是備援的。但是如果不小心,會産生Bug。
//将ADC采樣的數值ADCSample在液晶屏上顯示出來。
char DispBuff[20];//用于存儲采樣數值的每位數字和小數點。
main()
{
while(1)
{
TurnOnADC();//開始采樣
if(THRESHOLD<ADCSample)
{
sprintf(DispBuff,"%.2f",ADCSample);//将采樣數值轉換成字元存入數組中。
for(i=0;i<5;i++)
DispChar_EN(dispBuff[i]);//将采樣數值在螢幕上顯示出來。
}
}
}
使用上面的代碼會出現Bug,發現程式會停止,不再while中循環采樣顯示了,原因是在顯示的時候,我們顯示了5位,而在sprintf中我們保留了2為小數點,若ADCSample為1.23,則第五位的數值是未知的,其對應的字元也未知,而DispChar_EN()函數找不到對應的字元就會産生錯誤,導緻程式異常。
中文輸入法
在代碼的注釋時,常常會使用中文,但是在寫代碼的時候如果操作不當,會在輸入分号的時候采用了中文輸入法的分号,這時程式會報錯。
這樣類似的問題還有很多,今天就先到這裡啦,以後慢慢補充~
作者:伏熊(專業:射頻晶片設計、雷達系統、嵌入式。歡迎大家項目合作交流。)
微信:GuoFengDianZi