Rechen oder Denkfehler

hallo, ich rechne jetzt schon mit den Fingern nach und komme nicht auf das Ergebnis

long sek; sek= 3600 * 10; Serial.print(sek); // ergibt -29536

float zeit; zeit= 3600 * 10; Serial.print(zeit); // ergibt -29536.00

wo liegt da mein Denkfehler

Der Standard Datentyp ist int. Und int * int = int Schau dir den Wertebereich der Datentypen an und verinnerliche diese

Korrekt:

unsigned long sek = 3600UL * 10

OK Danke, ging davon aus, das der Wertebereich von der Variablen der Zuweisung festgelegt wird.

Wird er ja auch, durch den rechten Teil (die Zuweisung), der standartmäßig als int betrachtet wird.

Gruß Tommy

Naja, das ist eben eine beliebte C/C++ Stolperfalle :) in die man sehr sehr leicht stolpert. Vor allem, wenn man zuvor mit anderen Programmiersprachen zu tun hatte, wo so etwas nie ein Thema war ... :)

Der Compiler gibt in diesem Fall übrigens eine auffällig orange Warnung beim Kompilieren aus (selbst wenn man die "Ausführliche Ausgabe" nicht eingeschaltet hat):

warning: integer overflow in expression [-Woverflow]

   sek= 3600 * 10;

             ^

Du hast einen Überlauf da 36000 nicht in eine INT-Typ-Variable paßt. Die Int hat 16 Bit Länge (Vorzeichen und 15 bit Zahl) und für 36000 darzustellen bräuchtest Du 17 Bit (Vorzeichen und 16 Bit).

korrekt: long sek; sek= 3600L * 10; // "L" für long bzw "UL" für unsigned long

float zeit; zeit= 3600.0 * 10;

OK Danke, ging davon aus, das der Wertebereich von der Variablen der Zuweisung festgelegt wird.

Ja, der Variablen schon aber während der Rechnung werden standartmäßig 16 Bit Zahlen mit Vorzeichen (int) verwendet. Du kannst die Rechnung mit U, UL bzw .0 in einem bestimmten Format erzwngen.

Grüße Uwe

uwefed:
für 36000 darzustellen bräuchtest Du 17 Bit (Vorzeichen und 16 Bit).

Richtig,
oder aber auch so:
Um 36000 in 16 Bit darzustellen, musst du klar stellen, dass es vorzeichenlos ist.

const unsigned int sek = 3600U * 10; // hier (unsigned int) könnte man sogar auf das U verzichten!


Wobei das Ganze etwas verwirrend für mich ist, denn 36000UL entsprechen meist eher 36s als 10s.
Aber const unsigned int sek = 36*1000U; ist das gleiche Integer-überlauf-Problem.