之前的Arduino練習:seven-segment display七段顯示器與時鐘,我發現一件事情,記錄如下。
平時寫程式時,在Windows上、在Linux、在iPhone上、等等,int或unsigned int通常會是4 bytes,但C語言標準並沒有嚴格定義,各平台與實作可根據需求調整。而在Arduino上,int與unsigned int為2 bytes。
一天總共有86400秒,我在程式裡,想從0數到86399,程式碼如下:
for(unsigned long i = 0; i < 24*60*60; i++){
//...
}
可是卻發現,只會從0數到20863,咦,20864跑哪去了?unsigned long為4 bytes,明明空間足夠啊?
問題出在24*60*60:
24,為常數,型別會是int,沒問題。
24*60=1440,為常數,型別會是int,沒問題。
1440*60=86400,為常數,型別會是int,有問題,86400超過int能表示的範圍。
86400的二進位表示法為:
1 0101 0001 1000 0000
超過2 bytes,所以最前面那個1會不見,剩下:
0101 0001 1000 0000,也就是20864。
解決方式是在整數常數後面加上L或UL,代表型別為long或unsigned long。
for(unsigned long i = 0; i < 24UL * 60UL * 60UL; i++){
//...
}
如此即可。
參考資料:
- Arduino官方文件:int、unsigned int、long、unsigned long。
No comments:
Post a Comment