Wenn Sie eine Gleichung in C / C ++ schreiben, wirken sich die zu bearbeitenden Datentypen sehr real auf die Ausgabe der Gleichung aus.
Jeder Typ mag int
, float
und unsigned long
hat unterschiedliche Verhaltensweisen und benötigt eine bestimmte Menge an Speicherplatz zum Speichern.
int
(auf Arduino) wird in 16 Bit gespeichert, wobei die Hälfte seiner Werte für negative Zahlen, die Hälfte für positive Werte und ein Wert für 0 angegeben wird. Dies ergibt einen Bereich von -2 ^ 15 (-32.768) bis + 2 ^ 15-1 (32.767).
unsigned long
(auf Arduino) ist 32 Bit, aber keines wird als negativ bezeichnet. sein Bereich ist dann 0 bis 2 ^ 32-1 (4294967295).
Was für eine Art von Mathe? Welche andere Art der Verarbeitung ist bei der Arbeit mit Millis ausgeschlossen?
Der Kern des Problems ist, dass die Zeit, in der Millis zurückkehrt, immer über 32767 hinausgeht und Sie versucht haben, es in einem Int zu speichern. Das Arduino konnte es nicht, weil es eine int
so große Zahl nicht halten kann. Die Art der Mathematik, für die dies verboten ist, ist die Mathematik, die mit kleineren Datentypen geschieht, nicht mit bestimmten Operationen. Vielleicht helfen diese Beispiele:
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
Die Art und Weise, wie dies implementiert wird, ist wirklich ziemlich genial; Wenn Sie daran interessiert sind, woher diese Zahlen kommen und warum sie so übergreifen, wie sie es tun, sollten Sie sich die gleichen Erklärungen der Zweierkomplement-Zahlendarstellungen ansehen.