Når du skriver en ligning i C / C ++, har de datatyper, der betjenes, en meget reel effekt på ligningens output.
Hver type som int
, float
og usigneret lang
har forskellige adfærd og tager en vis plads i hukommelse, der skal gemmes.
int
(på arduino) gemmes i 16 bits, hvor halvdelen af dens værdier gives til negative tal, halv-1 gives til positive værdier og en værdi gives til 0 Det giver det et interval på -2 ^ 15 (-32,768) til + 2 ^ 15-1 (32,767).
usigneret lang
(på arduino) er 32 bits, men ingen betegnes som negative. dens rækkevidde er så 0 til 2 ^ 32-1 (4294967295).
Hvilken slags matematik? Hvilken anden form for behandling er udelukket, når du arbejder med millis?
Kernen i problemet er, at det er tiden millis returnerer nogensinde er kommet forbi 32767, og du forsøgte at gemme det i en int , kunne arduinoen ikke gøre det, fordi en int
ikke kan rumme så stort et nummer. Den type matematik, dette er uden for grænserne, er, at matematik sker for mindre datatyper, ikke for nogen specifikke operationer. Måske hjælper disse eksempler:
int i = 32767; Serial.println (i); // Ingen problemer her; det passer fint
32767
i = 32767 + 1; Serial.println (i); // Å nej, værdien passede ikke
-32768
usigneret lang fake_millis = 42000; jeg = falske_millis; Serial.println (i); // Dette er et eksempel på, at millis går forbi en int
-23536
i = -10; usigneret int j = i; Serial.println (j); // ingen måde at placere et negativt tal i en usigneret værdi
65526
uint32_t k = fake_millis; Serial.println (k); // usigneret lang er en uint32_t på arduino; dette fungerer godt!
42000
Den måde, dette implementeres på, er virkelig genialt; Hvis du er interesseret i, hvor disse numre kommer fra, og hvorfor de spreder sig på den måde, de gør, skal du se på de samme forklaringer på tos komplementære nummerrepræsentationer.