Hallo,
der Code unten führt bei mir sowohl auf dem UNO als auch auf dem MEGA 2560 zu folgender Ausgabe: "-7936".
Wo liegt mein Fehler?
void setup()
{
Serial.begin(9600);
int t = 16 * 3600;
Serial.println(t);
}
void loop()
{
}
Hallo,
der Code unten führt bei mir sowohl auf dem UNO als auch auf dem MEGA 2560 zu folgender Ausgabe: "-7936".
Wo liegt mein Fehler?
void setup()
{
Serial.begin(9600);
int t = 16 * 3600;
Serial.println(t);
}
void loop()
{
}
hans68:
Wo liegt mein Fehler?
Du programmierst einen Integer-Überlauf.
Der Zahlentyp int geht von ?32.768 bis +32.767.
Das ist ja der Hammer.
Danke!
Vielleicht solltest du auch die Lösung sagen:
unsigned long = 16 * 3600L;
oder:
unsigned long = 16 * (unsigned long)3600;
Das "L" oder der Cast sind ganz wichtig. Wenn das fehlt und selbst wenn der Datentyp links long ist, wird trotzdem standardmäßig in int gerechnet
EDIT:
Du kannst hier eventuell auch erst mal unsigned int verwenden. Das geht bis 65.535. Da geht das Ergebnis noch rein und du musst sonst nichts ändern. Aber bei 19 * 3600 schon wieder nicht
Daß standardmäßig long angenommen wird, läßt sich wahrscheinlich nirgends einstellen?
Nein. Das hat nichts mit dem Arduino an sich zu tun, sondern ist in C generell so. Und auch in vielen andere Sprachen.
Es ist auf 8-Bit Mikrocontrollern lediglich ein alltäglicheres Problem, da ein int nur 16 Bit hat. Auf einem PC hat int mindestens 32 Bit und ist damit so groß wie ein long hier. Daher hat man auf dem PC mit der Problematik nicht ganz so oft zu tun.
EDIT:
Ich habe dich vielleicht mit dem oben auch etwas verwirrt. Dein Problem hier ist erst mal, dass der Ziel-Datentyp links zu klein ist. Da ich hatte erst nicht gesehen, dass das noch in einen unsigned int passt. :s
Erst wenn du größer als 65.535 wirst, brauchst du unsigned long und musst dann rechts auch in long rechnen.
Serenifly:
Vielleicht solltest du auch die Lösung sagen:
...
Meinst sicher
long[b] t [/b] = 16*3600L;
oder
unsigned long[b] t [/b]= 16*3600L; // 16 Stunden sind 57600 Sekunden
In vielen anderen Sprachen wird man besser gewarnt, aber C ist was Besonderes.
Ich hab den Verdacht, der Compiler grinst fies und klammheimlich, wenn er solche Überläufe produziert
Oops. Ja :s
Selbst wenn es in C eine Warnung gäbe sind die in der Arduino IDE ausgeschaltet
Das "L" oder der Cast sind ganz wichtig. Wenn das fehlt und selbst wenn der Datentyp links long ist, wird trotzdem standardmäßig in int gerechnet
In diese Falle bin auch so oft getappt. Das ist nicht nur bei Int Variabeln so, auch bei floats muss man casten.
In Pascal muss man nur drauf achten das der Ergebnistyp dies speichern kann - also das zu keinem Überlauf kommt