Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » casting

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
31.08.2012, 11:29 Uhr
banshee



Hallo,

gibt es einen Unterschied zwischen:


C++:
float foo = 10.0f;
*((DWORD*)(&foo));


und dem ganz normalen cast:


C++:
float foo = 10.0f;
(DWORD)foo;


?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.08.2012, 12:45 Uhr
ao

(Operator)


Ja, gibts. (DWORD) foo wandelt den Fließkommawert in eine Ganzzahl um, und das Ergebnis ist 10. Portabel und sauber und mit jedem Compiler und auf jedem Prozessor dasselbe. Wobei man korrekterweise (DWORD) (foo + 0.5) machen sollte, um auch bei nicht-ganzzahligem Ausgangswert die richtige Rundung zu kriegen.

Der andere Code holt über einen Pointer das Binärmuster aus dem Speicher und interpretiert die Bits als Ganzzahl. Das ist was völlig anderes. Das Ergebnis ist hochgradig systemabhängig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.08.2012, 12:48 Uhr
banshee



ok, aber wenn ich unter ein und demselben OS bin (in erster Linie wohl Windows, weil mir der Zeigercast beim Setzen von DirectX-Renderstates über den Weg gelaufen ist), dann wäre beides äquivalent?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.08.2012, 13:32 Uhr
Tommix



Hallo,
Du hast nicht richtig gelesen:

Zitat von ao:

Der andere Code holt über einen Pointer das Binärmuster aus dem Speicher und interpretiert die Bits als Ganzzahl.


Mach einfach mal

C++:
DWORD d = *((DWORD*)(&foo));


und schau' Dir das Ergebnis an. Wenn beide Ausdrücke äquivalent wären, würde wohl kaum jemand den ersten verwenden.

Gruß, Tommix

Dieser Post wurde am 31.08.2012 um 13:33 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.08.2012, 14:09 Uhr
banshee



Doch, das hab ich schon gelesen. Was passiert denn überhaupt bei einem normalen cast? Im Prinzip muss doch da auch das Binärmuster eines floats in das eines DWORDS umgewandelt werden. Die sind beide wohl kaum gleich und deshalb beide casts nicht äquivalent, aber wenn bei der Interpretation als DWORD-Bitmuster was völlig anderes als 10.0f rauskommt, welchen Sinn hat dann überhaupt dieser Pointer-Cast?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.08.2012, 14:25 Uhr
Tommix



Die Frage nach dem Sinn stellt sich mir auch. Wenn man den DWORD-Wert auf die gleiche Weise zurückcasted, hat man (da immer noch das gleiche Bitmuster) wieder den selben float-Wert, selbst, wenn er Nachkommastellen hatte. Ich denke, das ist der Hintergrund der Sache, aber warum das zwischendurch ein DWORD sein muss, weiß ich nicht. Vielleicht soll der Wert als WPARAM oder LPARAM verschickt werden oder irgend so was in der Art.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: