2013-02-21 9 views
7

Qual è il valore più grande che un NSNumber può memorizzare?Qual è il valore più grande che un NSNumber può memorizzare?

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

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

Le risposte già rispondono alla domanda effettiva, quindi spiegherò l'errore. Il '1' in' 1 << 32' è un int, e il compilatore lo usa quando esegue lo spostamento. Poiché un int è 32 bit, non è possibile spostarlo di 32 posizioni. Se tu usassi '@ (1ULL << 32)', funzionerebbe, perché '1ULL' ha un tipo di unsigned long long. – ughoavgfhw

+0

Grazie, ottime informazioni. – Boon

+1

Perché questa domanda dovrebbe essere respinta? Giù vota la pesca a traina? – Boon

risposta

8

NSNumber è in realtà un class cluster, il che significa che quando si crea un'istanza si può essere sempre qualsiasi di una varietà di sottoclassi concrete, ciascuna in grado di memorizzare un diverso tipo di tipo numerico. I tipi effettivi disponibili e le loro dimensioni possono essere dipendenti dalla macchina.

Guardando il NSNumber documentation vi mostra i diversi tipi di numeri È possibile memorizzare: i due più grandi opzioni interi sarebbe in +numberWithLongLong: (o +numberWithUnsignedLongLong:), che memorizza un long long e +numberWithInteger: (o +numberWithUnsignedInteger:), che memorizza un NSInteger. I valori massimi NSNumber sono quindi limitati da questi tipi.

documentazione La Fondazione afferma:

Quando la creazione di applicazioni a 32 bit, NSInteger è un intero a 32 bit. Un'applicazione a 64 bit tratta NSInteger come un numero intero a 64 bit.

Il compilatore è intelligente e creerà un NSNumber dello stesso tipo del letterale numerico. Come menzionato nei commenti sopra, è possibile utilizzare @(1ULL << 32) se la propria macchina ha un tipo unsigned long long con più di 32 bit.

Inoltre, NSNumber è collegato a ponte a numero verde CFNumber, il che significa che è possibile provare funzioni come CFNumberGetByteSize() per se stessi e dare un'occhiata alla sezione Number Types della documentazione CFNumber. Vedrai che queste sono fondamentalmente le stesse delle opzioni NSNumber.

Inoltre, la classe NSDecimalNumber, una sottoclasse di NSNumber, fornisce il metodo +maximumDecimalNumber che è possibile utilizzare per trovare il valore massimo che può essere memorizzato in un NSDecimalNumber. NSDecimalNumber e i tipi a virgola mobile possono essere in grado di memorizzare numeri più grandi dei tipi interi, sebbene con precisione decrescente.

+0

Che dire di 'NSNumber * value = @ (pow (2, 128));'? – Sebastian

+1

@Sebastian Poiché 'pow' restituisce un' double', il compilatore userà '+ numberWithDouble:' (o qualcosa di equivalente a questo). – jtbandes

+0

Quindi è chiaramente più grande del più lungo 'lungo lungo ' – Sebastian

Problemi correlati