hex(&HFFFFABCD and &HFFFF) ?

20/11/2010 - 12:06 von Thomas Hoffmann | Report spam
Wieso kommt hier nicht &HABCD raus sondern &HFFFFABCD?
bin drauf gestoßen, da MS auf http://support.microsoft.com/kb/112651/en-us unter punkt 6
in der Funktion gethiloword mit long als Rückgabeparameter arbeitet, was für negative x
(zB &HABCD1234) ein falsches HIWORD zurückliefert, das man auch nicht durch obige
Bearbeitung richtig setzen kann:
also:
hex((&HABCD1234 and &HFFFF0000) \&H10000)
ergibt FFFFABCD und nicht ABCD

und
hex(((&HABCD1234 and &HFFFF0000) \&H10000) and &HFFFF)
ergibt ebenfalls FFFFABCD

erst
hex(cint((&HABCD1234 and &HFFFF0000) \&H10000))
ergibt ABDC, wobei das wieder in FFFFABCD übergeht, wenn man das, wie MS es tut, einer
long-Variablen übergibt.

(Auf http://support.microsoft.com/kb/189170/en-us wird mit integer Rückgaben garbeitet,
das klappt dann auch korrekt)
Thomas Hoffmann
 

Lesen sie die antworten

#1 Armin Zingler
20/11/2010 - 13:03 | Warnen spam
Am 20.11.2010 12:06, schrieb Thomas Hoffmann:
Wieso kommt hier nicht &HABCD raus sondern &HFFFFABCD?



Weil &Hffff als Integer-Literal angesehen wird und den Wert
-1 hat. Zur And-Verknüpfung wird der Wert auf Long erweitert
weil der erste Operand auch Long ist. -1 als Long-Wert ist
&HFFFFFFFF. Also steht da &HFFFFABCD And &HFFFFFFFF.
Ich kenne die VB6-Suffixe für die Datentypen leider nicht
mehr, aber wenn du &HFFFF als Long-Literal schreibst,
müsste es funktionieren. Also &HFFFF&


bin drauf gestoßen, da MS auf http://support.microsoft.com/kb/112651/en-us unter punkt 6
in der Funktion gethiloword mit long als Rückgabeparameter arbeitet, was für negative x
(zB &HABCD1234) ein falsches HIWORD zurückliefert, das man auch nicht durch obige
Bearbeitung richtig setzen kann:
also:
hex((&HABCD1234 and &HFFFF0000) \&H10000)
ergibt FFFFABCD und nicht ABCD



weil
&HABCD1234 And &HFFFF0000 = &HABCD0000 = -1412628480
&H10000 = 65536
-1412628480 (Long) / 65536 (Long) = -21555 (Long) = &HFFFFABCD


und
hex(((&HABCD1234 and &HFFFF0000) \&H10000) and &HFFFF)
ergibt ebenfalls FFFFABCD



s. Anfang

erst
hex(cint((&HABCD1234 and &HFFFF0000) \&H10000))
ergibt ABDC,



Klar, weil CInt(&HFFFFABCD) = &HABCD (Integer)

wobei das wieder in FFFFABCD übergeht, wenn man das, wie MS es tut, einer
long-Variablen übergibt.



Der Wert -21555 bleibt auch bei der Konvertierung von Integer nach Long
erhalten. Das Vorzeichen (oberstes Bit) wird bei solchen Operationen also
berücksichtigt.

(Auf http://support.microsoft.com/kb/189170/en-us wird mit integer Rückgaben garbeitet,
das klappt dann auch korrekt)



Korrekt ist es auch so - nur wahrscheinlich nicht das, was du erwartest. :)

Armin

Ähnliche fragen