Seite 1 von 3

LONG oder INTEGER

Verfasst: 21.10.2013 11:05
von Tommy
Hi :)
Sagt mal gibt es bis auf 64 Bit einen Unterschied zwischen long únd integer? Vom Speicherbereich ist es gleich. Macht es noch Sinn
long zu verwenden oder ist das total veraltet?

Re: LONG oder INTEGER

Verfasst: 21.10.2013 11:11
von NicTheQuick
Long macht da Sinn, wo du auf jeden Fall 32-Bit brauchst und nichts anderes. Das kann z.B. in bestimmten Strukturen der Fall sein.
Aber so alleine außerhalb einer Struktur macht es mehr Sinn Integer zu verwenden, um die Kompatibilität zu 64 Bit zu wahren. Selbst wenn die Werte nicht über 2^31-1 hinaus gehen, wird Integer vermutlich auf x64 schneller sein, da dann automatisch die nativen 64-Bit-Register verwendet werden, aber das ist jetzt nur eine Vermutung.

Als 32-Bit kompiliert, macht Integer und Long jedenfalls keinen Unterschied.

Re: LONG oder INTEGER

Verfasst: 21.10.2013 11:35
von CSHW89
Aus meiner Erfahrung heraus, versucht man am Anfang immer so wenig Speicher wie möglich zu verwenden. Also z.B. wenn eine Variable nur Zahlen von 0 bis 9 annehmen soll, den kleinsten Typ zu wählen (hier dann Byte). Aber heutzutage hat man so viel Speicher, dass das in den allermeisten Fällen kein Problem mehr darstellt. Auf der anderen Seite sind aber alle Typen langsamer als Integer (Ausnahme Long bei 32bit und Quad bei 64bit). Und auch wenn man heutzutage auch sehr schnelle Prozessoren hat, kann dieser Unterschied bei zeitkritischen Prozessen durchaus ins Gewicht fallen. Deshalb sollte man eigentlich immer Integer, oder, wenn man weiß, dass die Zahlen größer als 2^31 sind, Quad nehmen.
Ausnahmen gibt es da natürlich schon, aber da fällt mir z.Z. auch nur das Beispiel von Nic ein: irgendwelche Strukturen in Verbindung mit Api-Systemaufrufen.

lg Kevin

Re: LONG oder INTEGER

Verfasst: 21.10.2013 15:06
von Tommy
:allright: für eure Antworten.

Re: LONG oder INTEGER

Verfasst: 21.10.2013 20:02
von auser
Speziell wenn ich ElapsedMilliseconds() verwende (und das tue ich recht oft) finde ich PBs long eigentlich ziemlich essentiel weil der Rückgabewert von ElapsedMilliseconds() ebenso 4 bytes entspricht. Verwende ich da einfach int kann das bei längeren Laufzeiten problematisch werden.

Beispiel das auf 64 Bit mit int Probleme machen kann (je nachdem wie lange der Rechner läuft):

Code: Alles auswählen

timeout.i = ElapsedMilliseconds() + 2000
Delay(3000)
If ElapsedMilliseconds() - timeout > 0 : Debug("timeout") : Endif
Mit int auf 64 bit kann folgendes nach ein paar Wochen Laufzeit passieren. Der Wert von ElapsedMilliseconds() ist angenommen eine Sekunde davor von +2147483647 auf -2147483648 umzuspringen. Ich setze zu diesem Zeitpunkt wie gewohnt den Timeout auf ElapsedMilliseconds() + 2000 ... nur daß das 64bit int halt sich nicht gezwungen fühlt bei überschreiten von +2147483647 ins negative zu wechseln. Also hab ich dann plötzlich eine Zahl als Timeout > 2147483647 die ElapsedMilliseconds() nie überschreiten wird und nach 2 Sekunden - wo eigentlich der Timeout sein sollte da passiert (trotz Differenz-rechnen das zumindest das < > Problem löst) nix... weil -2.2 Mrd (die Millisekunden) - 2.2 Mrd (mein unglücklich großer Timeout) leider nicht größer 0 sondern -4.4 Mrd ist. Und das ist leider nachweislich kleiner als 0. -4.4 Mrd kannst du in 8 bytes (weil 64bit int) locker unterbringen... also wechselt das auch nicht wieder zurück ins positive. Und selbst wenn das ElapsedMilliseconds() nach ein paar Wochen wieder ins positive wechselt hilft das dem Timeout trotzdem nicht... der Wert war und ist immer noch zu groß.


Verwende ich an der Stelle durchgehend long (auch beim Differenz-Rechnen) hab ich das Problem nicht:

Code: Alles auswählen

timeout.l = ElapsedMilliseconds() + 2000
Delay(3000)
checktimeout.l = ElapsedMilliseconds() - timeout 
If checktimeout > 0 : Debug("timeout") : Endif 
Würde ich in dem Beispiel eine Sekunde bevor ElapsedMilliseconds() 2147483647 zurückgibt den timeout Wert setzen wäre er größer als long eigentlich fassen kann also wechselt (wie kurz darauf das ElapsedMilliseconds() ebenso) der Wert von meinem timeout.l ins negative und wäre dann -2147482649. Und in zwei Sekunden tritt trotz dem Wechsel von ElapsedMilliseconds() in negative Zahlen auch der Timeout ein. Weil -2147482648 - -2147482649 > 0 ist.

Und mal davon abgesehen ist der Typ auch in Strukturen wichtig die du z.B. mit anderen Applikationen teilen willst welche Felder haben die wirklich 4 bytes sind. Da kann ich dann nicht einfach int einsetzen und das nächste Feld um 4 bytes nach hinten schieben. Insofern ist Long definitiv nicht veraltet. Ist halt nicht überall sinnvoll.


Mfg,
auser

Re: LONG oder INTEGER

Verfasst: 21.10.2013 22:20
von CSHW89
Mal ganz davon ab, dass ich das negativ-zeugs nicht so ganz verstanden hab (ist aber auch egal), sollte man ElapsedMiliseconds nicht unbedingt für das Messen von Tagen oder gar von Wochen benutzen. Dieser Befehl ist eigentlich dafür da, um höchstens mal Minuten zu messen. Für längere Zeitabstände kann man Date verwenden, da bei Zeiten von Wochen, die Auflösung in Sekunden ausreichen sollte.

Re: LONG oder INTEGER

Verfasst: 21.10.2013 22:32
von STARGÅTE
Das meine auser damit auch nicht.
Nach ca. 24 Tagen (dauer ON-PC) gibt es bei ElapsedMiliseconds() einen Überlauf, und die Rückgabewerte (weil es Longs sind) werden negativ.
Hat man nun eine Zeit kurz davor (also positiv), dann muss es auch zum umbruch kommen, wenn man per Hand +2000 oder so macht (damit man es weiterhin richtig vergleichen kann), und das passiert nur bei Longs, und nicht bei Quads

Re: LONG oder INTEGER

Verfasst: 22.10.2013 07:59
von Thorium
Das Problem hätten wir allerdings nicht, wenn wir unsigned Integer hätten. ^^

Re: LONG oder INTEGER

Verfasst: 22.10.2013 08:09
von auser
CSHW89 hat geschrieben:Mal ganz davon ab, dass ich das negativ-zeugs nicht so ganz verstanden hab (ist aber auch egal), sollte man ElapsedMiliseconds nicht unbedingt für das Messen von Tagen oder gar von Wochen benutzen. Dieser Befehl ist eigentlich dafür da, um höchstens mal Minuten zu messen. Für längere Zeitabstände kann man Date verwenden, da bei Zeiten von Wochen, die Auflösung in Sekunden ausreichen sollte.
Wie kannst du dir so sicher sein daß es egal ist ob du etwas verstanden hast oder nicht um dann zu behaupten wie man etwas anders verwenden soll? /:-> Der Timeout ist (wie du im Beispiel eigentlich sehen solltest) nur 2 Sekunden groß und selbst wenn du ihn nur 1 Msecs groß setzt genügt das schon. Wenn du das mit dem "negativ-zeugs" übrigens nicht verstanden hast ist das schlecht: Man könnte nämlich versucht sein solche timeouts einfachheitshalber nur mit > < zu prüfen und sich die Differenzrechnung sparen (If ElapsedMilliseconds() > timeout) das ist genau so schlecht ... weil ElapsedMilliseconds früher oder später nun mal negative Werte zurück geben wird.

Re: LONG oder INTEGER

Verfasst: 22.10.2013 09:36
von STARGÅTE
auser hat geschrieben:weil ElapsedMilliseconds früher oder später nun mal negative Werte zurück geben wird.
Ist aber meiner Meinung nach ehr unwahrscheinlich, da es doch (meiner Meinung nach) ehr der Normalfall ist, dass der PC nach 1-3 Tagen neugestartet wird.
Thorium hat geschrieben:Das Problem hätten wir allerdings nicht, wenn wir unsigned Integer hätten. ^^
Dafür hätten wir dann andere Probleme, weil dann Leute wieder hier und dort den falschen Datentyp nutzen und wieder neue Fehlerquellen entstehen.