RONIN
Level-3
- Beiträge
- 2.529
- Reaktionspunkte
- 773
-> Hier kostenlos registrieren
Hallo Leute!
Ich war grad dabei einen Baustein zu schreiben der den SFC64 (TIME_TCK) einsetzt. Natürlich habe ich mir dabei über den Überlauf Gedanken gemacht und
ein wenig mit Zahlenwerten herum gespielt. Dabei ist mir etwas aufgefallen.
Nimmt man zum Beispiel den höchst möglichen Positiven Zahlenwert DW#16#7FFFFFFF oder +2147483647 und zieht davon L#100 ab bzw. addiert L#100 auf so erhällt man die Werte:
+2147483547 und
-2147483549
Man kann die beiden Werte jetzt als Beispiel für einen Wert vor dem Überlauf und für einen nach dem Überlauf hernehmen. Die absolute Differenz zwischen den Werten beträgt 4294967069.
Schreibt man jetzt in AWL aber:
L L#2147483547
L L#-2147483549
-D
oder
L L#-2147483549
L L#2147483547
-D
So lauten die Ergebnisse +200 bzw. -200 weil -D ja zwei 32Bit-Zahlen (unabhängig des Vorzeichens) voneinander subtrahiert.
Lange Rede, kurzer Sinn. Eigentlich muss man dann nicht immer den Überlauf von SCF64 durch eigenen Code abfangen, sondern nur wenn man sie direkt vergleicht oder absolut
behandelt.
Wenn man jetzt aber die Differenz bildet (zum Beispiel als "Elapsed-Time"-Wert) und mit dieser weiterarbeitet, so fällt der Überlauf eigentlich nicht ins Gewicht.
Wenn man dass so macht brauch man für den Überlauf keinen separaten Code zu schreiben
Oder vertuh ich mich da...
<EDIT>Hab das angehängte Beispiel so angepasst dass es zum Beitrag passt.</EDIT>
Ich war grad dabei einen Baustein zu schreiben der den SFC64 (TIME_TCK) einsetzt. Natürlich habe ich mir dabei über den Überlauf Gedanken gemacht und
ein wenig mit Zahlenwerten herum gespielt. Dabei ist mir etwas aufgefallen.
Nimmt man zum Beispiel den höchst möglichen Positiven Zahlenwert DW#16#7FFFFFFF oder +2147483647 und zieht davon L#100 ab bzw. addiert L#100 auf so erhällt man die Werte:
+2147483547 und
-2147483549
Man kann die beiden Werte jetzt als Beispiel für einen Wert vor dem Überlauf und für einen nach dem Überlauf hernehmen. Die absolute Differenz zwischen den Werten beträgt 4294967069.
Schreibt man jetzt in AWL aber:
L L#2147483547
L L#-2147483549
-D
oder
L L#-2147483549
L L#2147483547
-D
So lauten die Ergebnisse +200 bzw. -200 weil -D ja zwei 32Bit-Zahlen (unabhängig des Vorzeichens) voneinander subtrahiert.
Lange Rede, kurzer Sinn. Eigentlich muss man dann nicht immer den Überlauf von SCF64 durch eigenen Code abfangen, sondern nur wenn man sie direkt vergleicht oder absolut
behandelt.
Wenn man jetzt aber die Differenz bildet (zum Beispiel als "Elapsed-Time"-Wert) und mit dieser weiterarbeitet, so fällt der Überlauf eigentlich nicht ins Gewicht.
Wenn man dass so macht brauch man für den Überlauf keinen separaten Code zu schreiben
Oder vertuh ich mich da...
<EDIT>Hab das angehängte Beispiel so angepasst dass es zum Beitrag passt.</EDIT>
Zuletzt bearbeitet: