Ziel C. Casting int zu schweben

Lesezeit: 4 Minuten

Entschuldigung für diese allgemeine Frage, aber was ist die beste (so schnell wie möglich und sicherste) Methode, um in ObjC int in Float umzuwandeln:

Erste

int b = 10;
float a = [[NSNumber numberWithInt: b] floatValue]

Es wird____geben NSNumber Instanz und Nachrichten numberWithInt, floatValue wird gesendet, oder?

Zweite

int b = 10;
float a = (float) b;

C-Stil: Dies mit dem Aufruf einer Subroutine?

Oder irgendwie anders?

Und warum?

  • Verwenden Sie die Besetzung. Es ruft kein Unterprogramm auf. Der Compiler stellt sicher, dass der richtige Assemblercode verwendet wird.

    – Hooleyhoop

    20. April 2011 um 11:16 Uhr


  • Verwenden Sie nicht die Besetzung. Eine Fläche float a = b; genügt.

    – pmg

    20. April 2011 um 12:01 Uhr

Benutzeravatar von Sherm Pendley
Sherm Pendley

Die Typumwandlung im C-Stil ist am klarsten und am einfachsten zu lesen. Wenn ich zufällig Code gefunden habe, der eine erstellt hat NSNumber nur um die Konvertierung durchführen zu lassen, würde ich mich fragen: “Warum hat er das so gemacht? Passiert hier etwas anderes als eine einfache alte Typkonvertierung? Was übersehe ich?”

Was die Geschwindigkeit betrifft, vermute ich, dass die einfache Typkonvertierung auch schneller wäre – die NSNumber -Objekt muss für die Konvertierung ziemlich genau die gleichen Vorgänge ausführen und hat darüber hinaus den zusätzlichen Overhead der Objekterstellung und des Messaging. Aber wie in allen solchen Fällen, raten Sie nicht – messen Sie. Profilieren Sie Ihren Code, um zu sehen, ob die Conversion ein Engpass ist, der signifikant genug ist, um Ihre Aufmerksamkeit zu verdienen.

  • Ich möchte nur die füllen CGRect struct ungefähr 10 Mal und fand heraus, dass ich nicht weiß, wie ich am besten konvertieren kann

    Benutzer663896

    20. April 2011 um 10:58 Uhr


  • Die Frage ist dann, womit füllen? Wenn Sie sie mit wörtlich fest codierten Werten füllen, können Sie einfach schreiben NSMakeRect(1.0, 1.0, 1.0, 1.0), ohne dass eine Konvertierung erforderlich ist. Wenn Sie andererseits Daten aus einer Plist lesen, erhalten Sie sowieso ein NSNumber-Objekt, also rufen Sie es einfach auf -floatValue Methode. Geben Sie den Rückgabewert von ein -intValue würde nichts als sinnlose Verschleierung bewirken. Der einfachste Weg ist fast immer der beste.

    – Sherm Pendley

    20. April 2011 um 11:04 Uhr


  • Ich mache es drin for Zyklus von I get int value und übergebe diesen an CGRect Struktur

    Benutzer663896

    20. April 2011 um 11:08 Uhr

  • Verwenden Sie dann einfach eine Typumwandlung. Es ist am klarsten und am einfachsten zu lesen, und wenn Sie es nur zehn Mal machen, gibt es absolut NEIN Grund, Zeit damit zu verschwenden, es zu “optimieren”.

    – Sherm Pendley

    20. April 2011 um 11:15 Uhr

R.. GitHub STOP HELPING ICEs Benutzeravatar
R.. GitHub HÖREN SIE AUF, ICE ZU HELFEN

Da Sie nach der Sicherheit fragen, müssen Sie zuerst prüfen, ob der Wert Ihrer int passt in ein float. Andernfalls verlieren Sie stillschweigend Daten. Wenn der Wert nicht ziemlich klein ist, passt er nicht. Ich würde auf den Einsatz umsteigen double damit Sie sich darüber keine Gedanken machen müssen, dann nehmen Sie einfach die Zuweisung vor:

double d;
d = i;

Es gibt selten eine Verwendung für Variablen vom Typ floatähnlich wie short

  • -1 Der maximale Wert für einen Float ist viel größer als der Maximalwert für ein int. Der Höchstwert für einen Float ist als 3,40282347 x 10^38 definiert, während der Höchstwert für einen Int als 2147483647 definiert ist, wodurch der Höchstwert für einen Float 1,58456316 × 10^29 Mal größer ist

    – Nick

    25. April 2012 um 19:33 Uhr


  • @nick: Nur weil der Maximalwert größer ist, heißt das noch lange nicht int passt in ein float. A float (IEEE Single Precision) hat nur 24 Wertbits für die Mantisse. Das bedeutet, wenn eine Ganzzahl größer als 2^24-1 ist, passt sie nur in einen Float, wenn die niedrigen Bits alle Null sind. Das ist, 0x1fffffe passt aber 0x1ffffff nicht. Wenn Sie mir nicht glauben, versuchen Sie, letzteres in einen Float und zurück umzuwandeln, und Sie werden sehen, dass sich der Wert geändert hat. (Wenn Sie auf x86 mit GCC arbeiten, verwenden Sie unbedingt -ffloat-store oder es wird möglicherweise nicht konvertiert.)

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    26. April 2012 um 3:20 Uhr

  • Du hast Recht, das wusste ich nicht und ich entschuldige mich dafür, aber es kam mir ein wenig seltsam vor. Ich versuche, die -1 zu entfernen, aber es sagt mir, dass die Abstimmung gesperrt ist 🙁

    – Nick

    26. April 2012 um 16:04 Uhr

Ich sehe wirklich keine Notwendigkeit für eine NSNumber -Objekt, wenn eine direkte Typumwandlung zwischen zwei numerischen Grundelementen verfügbar ist. Der NSNumber Die Klasse war sowieso nicht nur für die Typkonvertierung gedacht.

1443570cookie-checkZiel C. Casting int zu schweben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy