Unsigned Long Integer in VB6

    • VB6

      Unsigned Long Integer in VB6

      Wie vielleicht einige von euch irgendwann mal frustrierend herausgefunden haben: Es gibt in VB6 keine unsigned Variablen (also Variablen, die nicht ins Negative gehen, dafür aber doppelt so groß nach oben hin sind). Das wirkliche Problem daran ist eigentlich, dass einige API-Aufrufe unsigned Longs zurück geben, VB diese jedoch als normale Longs erkennt und somit alle Werte > &H7FFFFFFF negativ sind.

      Die Lösung liegt in Variant oder Double und einer Konvertierung. Ganz ehrlich vermute ich, dass der Variant auch nur einen Double-Wert verwendet, jedoch will ich mir darüber nicht weiter den Kopf zerbrechen. Die folgende Funktion hat bei mir immer reibungslos funktioniert.

      Visual Basic-Quellcode

      1. Public Function Long2ULong(n As Long) As Variant
      2. If n < 0 Then
      3. Long2ULong = (n And &H7FFFFFFF) + 2147483648#
      4. Else
      5. Long2ULong = n
      6. End If
      7. End Function


      Ganz wichtig ist auch die 2147483648# so hinzuschreiben. Bei der Hexadezimal-Schreibweise landet man wieder bei einem negativen Wert, das # bringt VB dazu eine Gleitkomma-Konstante zu verwenden - Long ist ja hier zu klein. Es handelt sich bei signed Integern auf Intel-Architekturen übrigens um das Zweierkompliment, welches die höchste Stelle als negative Zahl ansieht. Bei einem signed Byte wäre also das MSB -128 statt +128 wert.

      Wenn man z.B. mit GetTickCount arbeiten will, braucht man auch noch eine Konstante für den Maximalwert von einem ULong, damit man Overflows behandeln kann und nicht immer diese schreckliche Zahl verwenden muss:

      Visual Basic-Quellcode

      1. Public Const ULongMax As Variant = 4294967295#



      Hier mein Beispielaufruf für GetTickCount:

      Visual Basic-Quellcode

      1. Static t as Variant
      2. Dim dt As Variant
      3. dt = Long2ULong(GetTickCount) - t
      4. If dt < 0 Then dt = dt + ULongMax
      5. If dt > .... Then
      6. ' Hier Aktion(en) ausführen
      7. t = Long2ULong(GetTickCount) ' Timer zurücksetzen
      8. End If


      Keywords: Visual Basic 6, Unsigned, Long, Datentyp, negativ

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()