且看下面兩個死循環,我曾經就踩過這個坑,是第二個坑,因此特意記錄一下。char在keil和iar中都是無符號的,因此要特別注意。
unsigned char i;
for(i=0;i<256;i++)
{
//something
}
當我們用上述代碼想實現一個小循環時,結果卻事與願違,這其實是死循環的另一種寫法,因為無符號變量i最大只有255,要命的是,編譯器並不會指出這個錯誤。
與之相類似的代碼是:
unsigned char i;
for(i=10;i>=0;i--)
{
//something
}
這也是一個死循環,你看出什么原因了嗎?無論i如何減,i都是大於等於0的。
這就告訴我們對於每個變量類型的取值范圍要由清醒的認識。值得注意的是相同的變量類型對於不同的CPU構架和不同的編譯器會有不同的結果。比如int類型在大多數16位CPU構架中占用兩個字節,但在32位CPU中卻往往占用4個字節;char類型在絕大多數編譯器中都是有符號數,但在keil MDK中卻是無符號數,若是要在keil MDK下定義有符號char類型變量,必須用signed顯式聲明。我曾讀過一本書,其中有一句話:“signed關鍵字也是很寬宏大量,你也可以完全當它不存在,在缺省狀態下,編譯器默認數據位signed類型”,這句話便是有異議的,我們應該對自己所用的CPU構架以及編譯器熟練掌握。
原文鏈接:https://blog.csdn.net/zhzht19861011/article/details/7251644