天天看點

C語言中的“陷阱”有符号數和無符号數if語句中的判斷A<x<B數組中備援的元素中文輸入法

目錄

  • 有符号數和無符号數
  • 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

繼續閱讀