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.
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
Grazie, ottime informazioni. – Boon
Perché questa domanda dovrebbe essere respinta? Giù vota la pesca a traina? – Boon