Setiap kali Anda menulis persamaan dalam C / C ++, tipe data yang dioperasikan memiliki efek yang sangat nyata pada output persamaan.
Setiap jenis suka int
,, float
dan unsigned long
memiliki perilaku yang berbeda, dan mengambil sejumlah ruang dalam memori untuk disimpan.
int
(on Arduino) adalah toko dalam 16 bit, dengan setengah dari nilainya diberikan ke angka negatif, setengah-1 diberikan ke nilai positif, dan satu nilai diberikan ke 0. Yang memberikan kisaran -2 ^ 15 (-32.768) ke + 2 ^ 15-1 (32.767).
unsigned long
(on Arduino) adalah 32 bit, tetapi tidak ada yang ditunjuk sebagai negatif. kisarannya adalah 0 hingga 2 ^ 32-1 (4294967295).
Matematika macam apa? Jenis pemrosesan lain apa yang dikecualikan saat bekerja dengan millis?
Inti dari masalah ini adalah bahwa waktu milis kembali pernah melewati 32767 dan Anda mencoba menyimpannya dalam sebuah int, Arduino tidak dapat melakukannya, karena seorang int
tidak dapat menyimpan angka sebesar itu. Jenis matematika yang terlarang adalah matematika yang terjadi pada tipe data yang lebih kecil, bukan operasi tertentu. Mungkin contoh-contoh ini akan membantu:
int i = 32767;
Serial.println(i);
//No problems here; it fits just fine
32767
i = 32767 + 1;
Serial.println(i);
//Oh no, the value didn't fit
-32768
unsigned long fake_millis = 42000;
i = fake_millis;
Serial.println(i);
//This is an example of millis going past an int
-23536
i = -10;
unsigned int j = i;
Serial.println(j);
//no way to put a negative number in an unsigned value
65526
uint32_t k = fake_millis;
Serial.println(k);
//unsigned long is a uint32_t on arduino; this works great!
42000
Cara ini diterapkan sangat jenius; Jika Anda tertarik dari mana angka-angka ini berasal dan mengapa angka-angka itu tumpah dengan cara mereka, Anda harus melihat penjelasan yang sama dari representasi angka pelengkap dua.