Die Variable secSunriseOpen schein also überzulaufen obwohl sie als long definiert wurde. Wenn ich die anderen 2 Variablen auch als long definiere funktioniert die Berechnung.
Warum wird hier das secSunriseOpen als int interpretiert ?
Gibt es einen eleganten Weg um dies zu umgehen ohne die Eingangsvariablen auch als long zu definieren?
ArduinoArti:
Warum wird hier das secSunriseOpen als int interpretiert ?
Gibt es einen eleganten Weg um dies zu umgehen ohne die Eingangsvariablen auch als long zu definieren?
Der Ziel-Datentyp ist erst mal egal. Gerechnet wird standardmäßig in int wenn nichts dabei steht. Außerdem hast du klar int * int. Was also wiederum int ist. Das Ergebnis wird dann dem Ziel zugewiesen
Serenifly:
Der Ziel-Datentyp ist erst mal egal. Gerechnet wird standardmäßig in int wenn nichts dabei steht. Außerdem hast du klar int * int. Was also wiederum int ist. Das Ergebnis wird dann dem Ziel zugewiesen
Ist das zweite UL nicht IMHO overhead? Ich handhabe es bisher so, das nur der erste Wert als L/UL deklariert wird. Muss ich mir Sorgen machen? Ein weiteres = ist ja nicht drin..
my_xy_projekt:
Ist das zweite UL nicht IMHO overhead? Ich handhabe es bisher so, das nur der erste Wert als L/UL deklariert wird. Muss ich mir Sorgen machen? Ein weiteres = ist ja nicht drin..
In diesem Fall dürfte folgendes auf jeden Fall reichen
Ja, könnte man sich wahrscheinlich sparen. Aber so extrem optimieren muss man hier auch nicht. Ich weiß dass wir hier gerne vorauseilend alles optimieren und "perfekt" machen wollen, aber wenn es nicht unbedingt nötig ist bringt das nicht viel
Wobei hier mein "Anstand" sagt, dass ein impliziter Cast, welcher zu einer Erweiterung des Datentypes führt, bedenkenlos akzeptabel ist.
Hier ist kein expliziter nötig ist, es reicht die Literale, beide, mit einem L zu versehen.
Bei einer absichtlichen Datentype "Verkleinerung" würde das anders aussehen.
Dort fordere ich (von mir selber) einen Cast, alleine schon um den Fall im Code selber zu dokumentieren.
Auch kostet es wenig, wenn man statt eines int Literal ein long Literal verwendet.
Der Compiler kanns es ja noch optimieren, ......
So ist, aus meiner Sicht, die richtige Lösung:
(sunriseOpenh * 3600L) + (sunriseOpenmin * 60L);
oder eben so
(sunriseOpenmin * 60L) + (sunriseOpenh * 3600L);
Ok, ok, ich gebs zu!
Das ist eher eine Glaubensfrage, oder eine Sache der Prinzipienreiterei
(um nicht "Disziplin" sagen zu müssen)
Fakt:
Der signed Überlauf ist ausdrücklich nicht definiert.
Der C++ Standard sagt, dass ein solcher Überlauf in ein "undefined Behavior" mündet.
Das wollen "WIR" nicht.
Von daher ist es erste Programmiererpflicht, dieses zu unterbinden.
Über die Art und Weise, das zu tun, kann man sich unterhalten, oder gar streiten.
Aber der Fakt, der steht da, in all seiner Unabwendbarkeit.
Nein.
Du weisst es doch selbst, das der Compiler schlau sein will und aufgrund seiner eigenen Schlauheit optimiert.
Im eingangs gezeigten Programm sind alle gezeigten Variablen und Berechnungen signed.
Ohne jede Ausnahme.
Das bestreite ich nicht.
Aber jetzt kommt die Frage der Fragen:
Dem Compiler ist bekannt, das (in dieser Konstellation) niemals signed zum Einsatz kommen muss.
Warum will/soll/muß er das verhunzen?
Ein "undefined Behavior" ist in dieser Konstellation niemals gegeben.
Nach Deinem Einsatz in der Frage der Verarbeitung von signed Variablen, den ich mit großer Aufmerksamkeit verfolgt habe, ist das IMHO leider - und das mit höchstem Respekt vor deinem Sprung ins Haifischbecken - nicht 1:1 übertragbar.
Bedenke:
Der Kompiler sieht [] nur das, was notiert wurde.
Richtig!
Es wurde notiert, das keine Variable jemals ins negative gehen kann.
Gehst Du mit mir mit, wenn ich an dieser Stelle unterstelle, das in den Entwicklungsstufen von c++ versäumt wurde diese Konstellation in die "Optimierung" aufzunehmen?
[edit]
Möglicherweise gibt es dazu eine Umsetzung.
Dann wäre es KEIN Versäumnis in der Entwicklung, sondern in der Verwendung.
Das entzieht sich aber meiner Kenntnis...
[/quote]
Zur Vollständigkeit antworte ich. Ich betrachte immer soweit möglich den gesamten Thread. Daraus geht hervor das man für die Berechnung für Sonnenauf- und untergang kein signed benötigt. Negative Uhrzeiten habe ich noch keine gesehen. Wenn der TO den Thread verfolgt, sollte er daraufkommen alle seine Variablen auf unsigend long umzustellen und mit UL zu rechnen. Mehr gibts dazu nicht zu sagen.
Undefined behaviour heisst, dass der Compiler naturlich vorzeichenbehaftete Variable negativ werden lassen darf, wenn sie überlaufen, wie leicht zu beobachten, aber auch sonstwas anderes zulässig wäre.
int ist leicht zu tippen, jedesintsteht erstmal imVerdacht, dass der Verfasser sich nichts dabei gedacht hat.
michael_x:
Undefined behaviour heisst, dass der Compiler naturlich vorzeichenbehaftete Variable negativ werden lassen darf, wenn sie überlaufen, wie leicht zu beobachten, aber auch sonstwas anderes zulässig wäre.
Genau!
Er dürfte auch bei Trump anrufen oder/und Ostern und Weihnachten auf einen Tag legen.
Bei einem UB ist im Prinzip das ganze Programm defekt.
Wenn der TO den Thread verfolgt, sollte er daraufkommen alle seine Variablen auf unsigend long umzustellen und mit UL zu rechnen. Mehr gibts dazu nicht zu sagen.
Gerne!
Wenn unsigned das richtige, ist, dann gerne.
Ist nicht meine Entscheidung.....
Wir hatten doch letztens hier erst einen Thread, bei dem durch einen signed-Überlauf beim print völlig falsche Zahlen angezeigt wurden.