[單晶片]-使用keil c 變數的範圍和可能產生錯誤

以下紀錄來提醒自己:

在Keil C的開發中,使用變數需要特別小心。

如果遇到數值狀態產生怪異變化,或是利用UART傳值發現數值為-1。

有可能是變數的範圍產生OVERFLOW。



 變數     範圍
char    -128~ 127
unsigned char 0 ~ 255 
int  -32768 ~ 32767 
unsigned int 是 0 ~ 65536
long , float , double 範圍都很大 理論上是夠用,但較占空間

使用不同的數值的時候,做數值的位移 >>  ,  <<  會導致數值有不同變化。

ex: 用 unsigned char位移後  如果位移後的值非unsigned 就會造成數值錯誤。

原因: 二進位的負數表示法,會把第一個當作成1,然後使用補數。

詳細可參考二進位的補數,維基百科

範例  
 變數     範圍
long value = 0;
unsigned char shiftvalue = 0xff;

value = shiftvalue<<8 ----=""> 應該變為 0xff00 數值轉換為 65280 

輸出value 卻等於 -256 
原因就是long 非 unsigned 會透過第一個位元去判斷是否1為正負號 因此數值會大大不同
在撰寫的時候應特別注意,不像高階語言那麼聰明可以直接轉換
基本上還是利用二進制判斷

以上為自己撰寫時常碰到的錯誤。
卻常常花許多時間在找問題。

結果只是變數型態最根本的問題。
如果有錯歡迎建議,也在此作紀錄以防日後遇到。

留言

這個網誌中的熱門文章

[單晶片]-寫I2C通訊(MPU6050為範例)

[研發替代役]-威聯通QNAP面試

[研發替代役]-明緯面試