2010-01-22 2 views
6

Desidero ottenere il valore lungo senza segno di un NSNumber. Non so perché, ma non funziona. Ecco quello che ho fatto:Impossibile ottenere il valore lungo senza firma di un NSNumber

NSString * stern = [idd objectAtIndex:indexPath.row]; // get a String with Number from a NSArray 
NSNumberFormatter * lols = [[NSNumberFormatter alloc] init]; 
NSNumber * iddd = [lols numberFromString:stern]; 
NSLog(@"%@", iddd); // I get the right number: 8084143463 
unsigned long fooo = [iddd unsignedLongValue]; 
NSLog(@"%lu", fooo); // I get the wrong number: 3789176167 
[twitterEngine deleteUpdate:fooo]; 
+0

Che aspetto hanno i valori nel debugger? Sono uguali a ciò che è stampato? –

+0

Per quello che vale, in 10.6.2, ottengo 8084143463 entrambe le volte e i valori del debugger sono coerenti. Suggerirei di sostituire la prima riga con 'NSString * stern = @" 8084143463 ";' e rinominare le variabili per dare un senso all'osservatore casuale. –

+0

Sì, NSNumber è 8084143463 e il non firmato lungo 3789176167 – Flocked

risposta

9
8084143463 == 0x1e1da3d67 
3789176167 == 0x0e1da3d67 

La dimensione di un sistema lungo a 64 bit è 8 byte. La dimensione di un lungo su un sistema a 32 bit (come l'iPhone) è di 4 byte. Devi usare un long long su un iPhone per memorizzare quel valore.

+0

Suona logisch, grazie per la risposta. Ma l'ho provato con long long fooo = [iddd longLongValue]; e foo è di nuovo 3789176167 – Flocked

+3

Avrai anche bisogno di usare l'identificatore di formato di '% llu'. –

+0

Ah ora funziona. Ho appena dimenticato di scrivere% llu in NSLog. Grazie! – Flocked

3

Il vostro valore è maggiore del valore massimo di un unsigned long può contenere (2^32-1 == 4,294,967,295) in modalità a 32 bit.