2012/02/23

Arduino小知識:int為2 bytes

之前的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++){
  //...

}

如此即可。


參考資料:


No comments:

Post a Comment