2010-09-19 10 views
8

Quindi essenzialmente la mia domanda è questa, sto creando un NSMutableDictionary usando gli oggetti uint64_t come chiave.Conversione (u) int64_t a NSNumeri

C'è un modo migliore per crearli rispetto a questo?

uint64_t bob=7; 

NSNumber *bobsNumber; 

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
bobsNumber=[NSNumber numberWithUnsignedLong:bob]; 
#else 
bobsNumber=[NSNumber numberWithUnsignedLongLong:bob]; 
#endif 

Questo potrebbe funzionare finché non ha incluso in un file/prese/NSData oggetto binario/qualunque cosa. Ma c'è un modo migliore per farlo? Mi piacerebbe davvero essere sicuro che l'oggetto sia a 64-bit indipendentemente dalla piattaforma su cui lo eseguo.

Credo che avrei potuto solo evitare tutto il problema andando sempre unsigned long lunga ma, naturalmente, che i rifiuti di tonnellate di spazio di heap su 64 macchine bit se assegnare questi oggetti in qualsiasi numero significativo ....

risposta

16

long long è 64-bit su piattaforme OS X/iOS a 64 bit. Su tutte le piattaforme discendenti OpenStep, numberWithUnsignedLongLong: è corretto per uint64_t.

L'ultima volta che ho controllato, quale metodo di fabbrica si utilizza in realtà non influisce sulla rappresentazione utilizzata in ogni caso; dipende solo dal valore del numero (a meno che non si usi una dimensione troppo piccola, causandone il troncamento).

Aggiornamento: questi giorni, la risposta corretta è NSNumber *bobsNumber = @(bob);.

+0

Il motivo per cui non ha importanza è che il compilatore conosce meglio le effettive larghezze di bit dei tipi utilizzati. Se non corrispondono, uno viene convertito nell'altro - tagliando i bit o estendendoli con gli 0 iniziali. –

+0

Stai fraintendendo. Quello che intendo nel secondo paragrafo è che '[NSNumber numberWithLongLong: 73]' produrrebbe lo stesso oggetto di '[NSNumber numberWithChar: 73]', piuttosto che uno che produce un oggetto con un 'long long' e l'altro un oggetto supportato da un 'char'. Ora che mi preoccupo di ricontrollare, questo non è il caso in 10.6.4. (Puoi controllare con 'CFShow()', che ti dice la rappresentazione interna.) –