[單晶片]-使用keil c 變數的範圍和可能產生錯誤
以下紀錄來提醒自己:
在Keil C的開發中,使用變數需要特別小心。
如果遇到數值狀態產生怪異變化,或是利用UART傳值發現數值為-1。
有可能是變數的範圍產生OVERFLOW。
使用不同的數值的時候,做數值的位移 >> , << 會導致數值有不同變化。
ex: 用 unsigned char位移後 如果位移後的值非unsigned 就會造成數值錯誤。
原因: 二進位的負數表示法,會把第一個當作成1,然後使用補數。
詳細可參考二進位的補數,維基百科。
範例
以上為自己撰寫時常碰到的錯誤。
卻常常花許多時間在找問題。
結果只是變數型態最根本的問題。
如果有錯歡迎建議,也在此作紀錄以防日後遇到。
在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為正負號 因此數值會大大不同
在撰寫的時候應特別注意,不像高階語言那麼聰明可以直接轉換
基本上還是利用二進制判斷
8>
以上為自己撰寫時常碰到的錯誤。
卻常常花許多時間在找問題。
結果只是變數型態最根本的問題。
如果有錯歡迎建議,也在此作紀錄以防日後遇到。
留言
張貼留言