Ogni volta che si scrive un'equazione in C / C ++, i tipi di dati su cui si opera hanno un effetto molto reale sull'output dell'equazione.
Ogni tipo piace int
, float
e unsigned long
ha comportamenti diversi e occupa un certo spazio in memoria per l'archiviazione.
int
(su arduino) è memorizzato in 16 bit, con metà dei suoi valori dati a numeri negativi, metà 1 data a valori positivi e un valore dato a 0. Questo gli dà un intervallo di -2 ^ 15 (-32.768) a + 2 ^ 15-1 (32.767).
unsigned long
(su arduino) è 32 bit, ma nessuno è designato come negativo. il suo intervallo è quindi da 0 a 2 ^ 32-1 (4294967295).
Che tipo di matematica? Che tipo di altro tipo di elaborazione è escluso quando si lavora con millis?
Il punto cruciale del problema è che il tempo in cui i millesimi di ritorno sono mai passati oltre 32767 e hai provato a memorizzarlo in un int, l'arduino non è riuscito a farlo, perché int
non può contenere un numero così grande. Il tipo di matematica che è off limits è la matematica che sta accadendo a tipi di dati più piccoli, non a operazioni specifiche. Forse questi esempi aiuteranno:
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
-23.536
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
Il modo in cui questo è implementato è davvero abbastanza geniale; Se sei interessato a da dove provengono questi numeri e perché si riversano nel loro modo, dovresti esaminare le stesse spiegazioni delle rappresentazioni dei numeri del complemento a due.