Frage zu LOWORD



  • Hallo

    Was ist LOWORD ?

    Laut MSDN: Retrieves the low-order word from the specified value.
    Gibt das low-order word von einem spezifizierten Wert zurück. ( Was soll ich mir darunter vorstellen ) o_O

    http://msdn.microsoft.com/en-us/library/ms632659(VS.85).aspx



  • Wenn du einen 32 Bit Wert hast, dann gibt dir LOWORD die niederwertigen 16 Bit zurück (HIWORD eben den Rest).

    `

    int doppelwort=0xAFFE;

    short lo=LOWORD(doppelwort); //ist 0xFE

    short hi=HIWORD(doppelwort); //ist 0xAF

    `

    Schau dir einfach die Definitionen der Makros an und rechne sie vielleicht mal kurz per Hand durch, dann ist dir das ganz schnell klar.



  • Ein DWORD lässt sich auch in 2 WORDS aufspalten. Das brauchst du dann, wenn du mit 1 Variable 2 Werte übergeben willst. Unter Windows ist das bei der Window Procedure, welche sämtliche Nachrichten erhält üblich. Diese hat dann 2 Parameter: WPARAM und LPARAM. LPARAM ist ein DWORD. So wird z.B. bei WM_SIZE in lparam die neue Größe des Fensters abgelegt (Höhe und Breite).

    int width, height;
    width=LOWORD(lparam);
    height=HIWORD(lparam);
    

  • Mod

    _matze schrieb:

    Wenn du einen 32 Bit Wert hast, dann gibt dir LOWORD die niederwertigen 16 Bit zurück (HIWORD eben den Rest).

    int doppelwort=0xAFFE;
    
    short lo=LOWORD(doppelwort); //ist 0xFE
    short hi=HIWORD(doppelwort); //ist 0xAF
    

    Schau dir einfach die Definitionen der Makros an und rechne sie vielleicht mal kurz per Hand durch, dann ist dir das ganz schnell klar.

    Das ist falsch. Was Du hier beschreibst ist LOBYTE und HIBYTE! Dein Beispiel würde für lo und hi den gleichen Wert ergeben.
    Korrekt ist:

    int doppelwort=0xBAFFAFFE;
    
    short lo=LOWORD(doppelwort); //ist 0xAFFE
    short hi=HIWORD(doppelwort); //ist 0xBAFF
    


  • Martin Richter schrieb:

    _matze schrieb:

    Wenn du einen 32 Bit Wert hast, dann gibt dir LOWORD die niederwertigen 16 Bit zurück (HIWORD eben den Rest).

    int doppelwort=0xAFFE;
    
    short lo=LOWORD(doppelwort); //ist 0xFE
    short hi=HIWORD(doppelwort); //ist 0xAF
    

    Schau dir einfach die Definitionen der Makros an und rechne sie vielleicht mal kurz per Hand durch, dann ist dir das ganz schnell klar.

    Das ist falsch. Was Du hier beschreibst ist LOBYTE und HIBYTE! Dein Beispiel würde für lo und hi den gleichen Wert ergeben.
    Korrekt ist:

    int doppelwort=0xBAFFAFFE;
    
    short lo=LOWORD(doppelwort); //ist 0xAFFE
    short hi=HIWORD(doppelwort); //ist 0xBAFF
    

    Upps! Klar, hast Recht...



  • Hallo

    In der windef.h steht:

    #define LOWORD(l) ( (WORD)((DWORD_PTR) (l) & 0xffff))

    Also ich weiss:

    1 Word = 2 Byte

    1 DWORD = 4 Byte

    Aber was soll DWORD_PTR sein ?

    Ich kenne von Assembler zwar sowas z.b:

    MOV DWORD PTR DS:[5C2FBC],8

    Aber was genau ist das jetzt in C++ ?
    und was soll das (1) und wieso wird das dann mit 0xffff verodert.

    Also mir sagt das gar nix. 😞



  • Verundet, nicht verodert!

    0xDEADBEEF
    AND 0x0000FFFF
    --------------
        0x0000BEEF  <= mit der Verundung kommst du an die niedrigen 2 Bytes ran und nullst den Rest
    


  • Ja verundet ist mir auch gerade aufgefallen.^^

    Was ist das hier für ein Wert ?

    0xDEADBEEF



  • var schrieb:

    Ja verundet ist mir auch gerade aufgefallen.^^

    Was ist das hier für ein Wert ?

    0xDEADBEEF

    Das ist dezimal 3735928559 und das entspricht haargenau der... nee Quatsch, ich mach nur Spaß. Das ist einfach eines der lustigen Wörter, die sich mit hexadezimalen Zahlen (A-F) abbilden lassen. 😉



  • Sieh dir mal http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_debug_values an. Dort wird auch 0xDEADBEEF beschrieben.


Anmelden zum Antworten