Multiplikation - verschiedene Ergebnisse

Hallo,

wieso bringt dieses Programm

unsigned long nZeit1 = 0; 


// -------------------------------------------------------------------
void setup(void)
{
  Serial.begin(115200);

  nZeit1 = (1000 * 60);
  Serial.println(nZeit1);

  nZeit1 = (1000.0 * 60.0);
  Serial.println(nZeit1);

  nZeit1 = (60000);
  Serial.println(nZeit1);

}
// -------------------------------------------------------------------
void loop()
{
}

dieses Ergebnis ?

4294961760 60000 60000

1000*60 müsste doch in eine long-Variable reinpassen....

Gruß Uwe

siehe hier

1000*60 müsste doch in eine long-Variable reinpassen....

Paßt rein, aber die Berechnung vorher wird in INT ausgeführt.

So wird mit LONG gerechnet. nZeit1 = (1000L * 60L);

Achtung: Fließkommazahlen des Arduino haben eine Genauigkeit von 6-7 Ziffern. Darum ist es besser mit long bzw unsigned long zu rechnen

Grüße, der andere Uwe

Danke....

Darum ist es besser mit long bzw unsigned long zu rechnen

Nicht nur deswegen: Ein atmega controller kann gar kein float. Die float-arithemtik wird nur in Software emuliert, ist also ziemlich langsam.

unsigned long x = (1000 * 60) ; // 4294961760

kann man auf dem Windows10 Taschenrechner wie folgt nachvollziehen:

→ Ansicht : Programmierer
1000 * 60 = → 60,000
→ HEX → EA60
→ WORD → DEC → -5,536
→ DWORD 5536 ± → -5,536
→ HEX → FFFF EA60
→ MS (damit es nicht verloren geht )
→ QWORD → Arbeitsspeicher → FFFF EA60 (calc.exe kann keine vorzeichenlosen Zahlen)
→ DEC → 4,294,961,760