was macht (short)(*(((short*)&long_var)+1)) ???
-
Hallo zusammen,
kann mir jemand erklären, was hier passiert?
#define High_Word(long_var) (short)(*(((short*)&long_var)+1))
Also ich meine nicht, daß mir jemand das #define erklären soll, sondern das, was rechts steht.
Ich habe eine long-Variable (long_var). Mit dem &-Operator erhalte ich doch dessen Adresse, oder? Und mit (short*) zeige ich mit einem short-Pointer auf das erste Bit der "long_var"-Variablen. Danach müsste der Pointer um eins erhöht werden, sprich er zeigt jetzt auf das 2. Bit meiner "long_var"-Variablen. Aber danach versteh ich nicht mehr ganz, wie es weiter geht....
Kann mir da jemand weiterhelfen, bzw. korrigieren, falls es bis dahin schon falsch ist?
Danke Euch!
Gruß, bierbauch
-
Deine erklärung ist fast richtig. Ersetze nur Bit mit short.
und am ende wird noch dereferenziert um den wert der short zu bekommen. => das high-word einer long.
K
-
wäre
#define High_Word(long_var) ((long_var) & 0xffff0000L) >> 16) #define Low_Word(long_var) ((long_var) & 0x0000ffffL))
nicht übersichtlicher
-
Aber wieso macht man das so kompliziert?
Ist das nicht das gleiche wie:lng_variable >> 16;
Dann erhalte ich doch auch das High Word...? Oder denke ich grad etwas verdreht?
Gruß
-
Mal sehen, ob einer eine noch einfacher Lösung findet.
-
wie wär's mit
#define High_Word(long_var) long_var/65536
Kurt
-
Division ist ungeschickt
-
Ja, ich muß fairerweise dazu sagen, daß die Zeile aus dem Programm für einen DSP stammt. Vielleicht hilft das.
Aber meine Frage bleibt: wieso so "kompliziert"? Oder ist das die schnellste Art, das High Word zu bekommen?Gruß
-
Bei deinen ganzen Pointer ist der Vorteil villeicht (ich weis nicht ob es nacher noch was aus macht) dass du keine neue Variable erzeugst sondern nur einen Pointer auf den Teil der Variablen.
-
Der makro mit den pointern kommt im idealfall mit einer einzigen ladefunktion mit konstantem offset vom speicher in einen register aus.
Beim makro mit >> muss zuerst der wert vom speicher in einen register geladen und dann noch geschiftet ( und eventuell maskiert ) werden das sind mindestens zwei instruktionen.
Kurt