2016-11-29 1 views
0

Edit: Ich bin auf der Suche nach reinterpret_cast in Objective-C so ist das folgende sinnlos für meine beabsichtigte Frage.Wie macht man eine Neuinterpretation mit Obj-C?

Gibt es in Objective-C statische Umwandlungen?

z.B. in diesem C++ Beispiel static_cast ist aus gutem Grunde verwendet:

float rnd = static_cast <float> (rand())/static_cast <float> (RAND_MAX); 

ich einen union oder Zeiger die Verwendung direkt mit dem Integer-Wert als Schwimmer Zugriff denken kann, aber das würde den Code viel mehr komplexer.

Wie würde ich das gleiche wie im C++ Beispiel bequem in Objective-C tun?

+0

Eine 'union' führt keine statische Umwandlung durch, um' float' in 'int' umzuwandeln. – Gerard

+1

Sie schreiben 'static_cast', aber Ihr Kommentar zu' union' deutet darauf hin, dass Sie vielleicht 'reininterpret_cast' denken. Kannst du erklären und erklären, was deiner Meinung nach die Semantik deines Ausdrucks ist? – CRD

+0

Sie haben Recht, ich suchte nach 'reininterpret_cast'. Es tut mir leid für das Missverständnis. – KugelnMMXVI

Antwort

0

Nach der Klärung Sie sind nach reinterpret_cast:

Sie sind richtig Sie es mit einem tun union. Wenn Sie es tun wollen Inline Sie eine Besetzung verwenden können, Adress-of und indirection ...

Die C-Stil Guss (type)expr in beiden (objektiv-) C und C++ funktioniert ähnlich: Wenn das Äquivalent eines static_cast ist Geeignet tut es das, z zwischen int und float und anderen Werttypen; ansonsten wird es das Äquivalent von reinterpret_cast, z.B. zwischen Zeigertypen.

So müssen Sie nur zu einem Zeiger, Cast und indirekt konvertieren. ZB:

int z = 0xDEADBEEF; 
float y = *(float *)&z; 
NSLog(@"%d -> %f", z, y); 

Ja, es ist ein bisschen hässlich, aber dann, was Sie tun, ist auch ;-) es schöner etwas Um es als Makro definiert werden:

#define REINTERPRET(type, expr) (*(type *)&(expr)) 

, die Sie verwenden können, wie:

int z = 0xDEADBEEF; 
float y = REINTERPRET(float, z); 
NSLog(@"%d -> %f", z, y); 

wie bei reinterpret_cast, sollten Sie diese sparsam und mit Vorsicht verwenden!

HTH

+0

Vielen Dank. Da diese Funktionalität in Objective-C nicht direkt implementiert ist, ist Ihre Lösung die beste, die ich bekommen konnte. – KugelnMMXVI

2

Objective C ist eine Obermenge von C dies so tun die C Weg und einfache Würfe

float rnd = (float) (rand())/(float)(RAND_MAX); 
+0

Dies funktioniert, aber es macht nicht die gleiche Sache. – KugelnMMXVI

+0

@KugelnMMXVI - Auf welche Weise macht es nicht dasselbe? – CRD

+1

Ich glaube nicht, dass Sie so viele Casts brauchen.'(float) (rand())/(RAND_MAX)' sollte wie vorgesehen funktionieren. – JAL