LONG oder INTEGER

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

LONG oder INTEGER

Beitrag 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?
Zuletzt geändert von Tommy am 27.01.2015 11:42, insgesamt 2-mal geändert.
PB 5.41 x64
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: LONG oder INTEGER

Beitrag 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.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: LONG oder INTEGER

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: LONG oder INTEGER

Beitrag von Tommy »

:allright: für eure Antworten.
Zuletzt geändert von Tommy am 27.01.2015 11:42, insgesamt 2-mal geändert.
PB 5.41 x64
auser
Beiträge: 58
Registriert: 17.05.2011 10:56

Re: LONG oder INTEGER

Beitrag 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
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: LONG oder INTEGER

Beitrag 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.
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: LONG oder INTEGER

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: LONG oder INTEGER

Beitrag von Thorium »

Das Problem hätten wir allerdings nicht, wenn wir unsigned Integer hätten. ^^
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
auser
Beiträge: 58
Registriert: 17.05.2011 10:56

Re: LONG oder INTEGER

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: LONG oder INTEGER

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten