2013-02-21 8 views
7

Welchen größten Wert kann eine NSNummer speichern?Was ist der größte Wert, den eine NSNumber speichern kann?

// ok 
    NSNumber *value = @(1 << 31); 

// gives compiler error, so max NSNumber is 32-bit uint? 
    NSNumber *value = @(1 << 32); 
+5

Die Antworten beantworten bereits die eigentliche Frage, also erkläre ich den Fehler. Die "1" in "1 << 32" ist ein Int, und der Compiler verwendet dies, wenn er die Verschiebung ausführt. Da ein int 32 Bits ist, können Sie nicht 32 Positionen verschieben. Wenn Sie '@ (1ULL << 32)' verwenden, würde es funktionieren, weil '1ULL' einen Typ von unsigned long long hat. – ughoavgfhw

+0

Danke, sehr gute Infos. – Boon

+1

Warum sollte diese Frage abgelehnt werden? Down Abstimmung Trolling? – Boon

Antwort

8

NSNumber ist eigentlich ein class cluster, was bedeutet, dass, wenn Sie eine Instanz erstellen Sie kann eine beliebige aus einer Vielzahl von konkreten Unterklassen bekommen, die jeweils eine andere Art von numerischen Typ zu speichern. Die tatsächlich verfügbaren Typen und ihre Größen können maschinenabhängig sein.

am NSNumber documentation Blick zeigt Ihnen die verschiedenen Arten von Zahlen, die Sie speichern können: Die beiden größten Integer-Optionen wäre +numberWithLongLong: (oder +numberWithUnsignedLongLong:), die eine long long speichert und +numberWithInteger: (oder +numberWithUnsignedInteger:), die eine NSInteger speichert. Die maximalen NSNumber-Werte sind daher durch diese Typen begrenzt.

Die Stiftung Dokumentation heißt es:

Beim Bau 32-Bit-Anwendungen, NSInteger eine ganze Zahl 32-Bit ist. Eine 64-Bit-Anwendung behandelt NSInteger als 64-Bit-Ganzzahl.

Der Compiler ist intelligent und erstellt eine NSNummer des gleichen Typs wie Ihr numerisches Literal. Wie in den obigen Kommentaren erwähnt, können Sie @(1ULL << 32) verwenden, wenn Ihr Computer einen unsigned long long-Typ mit mehr als 32 Bit hat.

Darüber hinaus ist NSNumber gebührenfrei zu CFNumber überbrückt, so dass Sie Funktionen wie CFNumberGetByteSize() selbst ausprobieren können - und schauen Sie sich den Abschnitt Number Types der CFNumber Dokumentation an. Sie werden feststellen, dass diese im Prinzip mit den NSNumber-Optionen übereinstimmen.

Zusätzlich bietet die NSDecimalNumber-Klasse, eine Unterklasse von NSNumber, die Methode +maximumDecimalNumber, die Sie verwenden können, um den Maximalwert zu finden, der in einer NSDecimalNumber gespeichert werden kann. NSDecimalNumber und die Gleitkommatypen können möglicherweise größere Zahlen als die Integer-Typen speichern, allerdings mit abnehmender Genauigkeit.

+0

Was ist mit 'NSNumber * value = @ (pow (2, 128));'? – Sebastian

+1

@Sebastian Da 'pow' ein' double' zurückgibt, verwendet der Compiler '+ numberWithDouble:' (oder etwas Ähnliches). – jtbandes

+0

Also ist es deutlich größer als die größte 'long long' – Sebastian

Verwandte Themen