Multiplikation nicht kommunitiv?

Hallo zusammen,

ich bin gerade auf ein Problemchen gestoßen (UNO), dass die Multiplikation evtl. nicht völlig kommunitiv ist, zumindest, was die Ausführung in int oder long betrifft.

int JAHR = 2018, MONAT = 10, TAG = 2;
      
void setup() {  
  Serial.begin(115200);
  Serial.println("Start");
  unsigned long res = 1L * JAHR * MONAT * TAG;
  Serial.println(res);
  res = JAHR * MONAT * TAG * 1L;
  Serial.println(res);
}

void loop() {
}

liefert:

Start
40360  <-- richtig
4294942120 <-- falsch

Nach meinem Verständnis müssten beide mathematisch das gleiche Ergebnis liefern.

Kann das mit der Auswertung des Ausdrucks von links nach rechts zu tun haben?

Ich bin da etwas verwirrt.

Gruß Tommy

Das wird von links nach rechts abgearbeitet. Wenn 1L erst am Ende kommt hast du am Anfang einen Überlauf

Ok, danke. Dann war meine Idee mit der Abarbeitungsreihenfolge doch richtig. Ich war mir da nicht sicher, weil es mathematisch ja unsinnig ist und gegen die Kommutation verstößt.

Gruß Tommy

Du kannst die Auswertungsreihenfolge auch umkehren.

res = JAHR * (MONAT * (TAG * 1L));

Dann wird alles in Long gerechnet.
Der Datentype pflanzt sich in Auswertungsreihenfolge des Ausdrucks fort.

Ja. Da die Multiplikation mathematisch als kommunitiv definiert ist, war mir nicht klar, das das hier bezüglich der Wertebereiche verletzt wird.
Man lernt halt immer dazu und das ist das Gute daran.

Gruß Tommy