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.
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:
Hier mein Beispielaufruf für GetTickCount:
Keywords: Visual Basic 6, Unsigned, Long, Datentyp, negativ
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.
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:
Hier mein Beispielaufruf für GetTickCount:
Keywords: Visual Basic 6, Unsigned, Long, Datentyp, negativ
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()