Gegeben sei eine nette Standard-WinProc:
Quelltext
1:
| function WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; |
Nun weiß man, daß sowohl wParam wie auch lParam vorzeichenlose Zahlen sind.
Nun sehen wir uns das mal an:
Quelltext
Was will uns dieser Code sagen ?
Tja - unter C käme die nette Meldung 'Condition always true' (wenn >= verwendet würde).
Wie kann auch eine vorzeichenlose Zahl jemals negativ werden ? - Also stimmt die Bedingung nur bei 0 nicht ... sozusagen ist das ganze Müll. *g*
Klar werden die einen sagen, vorzeichenlose, vorzeichenbehaftet - 2er Kompliment machts möglich und eigentlich Wurscht.
Das scheint falsch zu sein, sonst würde der D7-Compiler nicht so empfindlich darauf reagieren (sollte man sich den Assembercode mal ansehen, was da intern bei sowas passiert).
Wiefe Leute haben einen type-cast gesetzt - so nach dem Motto:
Quelltext
1:
| if longint(wParam) > 0 then |
Aber ist das so fein ?
Hm - meines Achtens sehr gefährlich die Sache oder besser unhübsch. Ein type-cast kann ebenfalls sehr suspekt sein ... also warum nicht gleich auf die hübsche Weise ...
Quelltext
1:
| if not (wParam and $80000000) then |
Das ist
a) das selbe ...
b) sagt mehr aus (meiner Meinung - wenn das HSB high, dann negativ) ...
c) es ist transparent.
Fazit: Interessantes Thema zum Fachsimplen, besonders da ja sogar der obrige Code Maschinen- und OS-abhängig ist - aber eh, das ist die WinProc von sich aus (man denke nur an die 16Bit/32Bit Umstellung). Also wenn ein 64Bit Windows kommt, dann muß man die Funktion sowieso umstellen (schon alleine wegen der WinProc das Programm mindestens neu programmieren).
Wer früher stirbt, ist länger tot.