2010-09-19 15 views
8

Así que, esencialmente, mi pregunta es la siguiente: estoy creando un NSMutableDictionary utilizando objetos uint64_t como clave.Conversión (u) int64_t en NSNumbers

¿Hay alguna forma mejor de crearlos que haciendo esto?

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 

Esto funcionaría, siempre y cuando no la incluyó en un archivo/hembra/NSData objeto binario/lo que sea. Pero, ¿hay alguna forma mejor de hacer esto? Realmente me gustaría estar seguro de que el objeto sea de 64 bits, independientemente de la plataforma en la que lo ejecute.

Creo que sólo podía evitar todo el problema siempre va unsigned long long pero por supuesto que los desechos toneladas de espacio de almacenamiento dinámico en máquinas de 64 bits si asignar estos objetos en un número significativo ....

Respuesta

16

long long es de 64 bits en las plataformas OS X/iOS de 64 bits. En todas las plataformas con OpenStep, numberWithUnsignedLongLong: es correcto para uint64_t.

La última vez que verifiqué, el método de fábrica que usa en realidad no afecta la representación utilizada; solo depende del valor del número (a menos que use un tamaño demasiado pequeño, lo que hace que se trunque).

Actualización: En estos días, la respuesta correcta es NSNumber *bobsNumber = @(bob);.

+0

La razón por la que no importa es que el compilador conoce mejor los anchos de bit reales de los tipos utilizados. Si no coinciden, uno se convierte en el otro, ya sea recortando bits o extendiéndose con los primeros 0. –

+0

Estás malentendido. Lo que quiero decir en el segundo párrafo es que '[NSNumber numberWithLongLong: 73]' produciría el mismo objeto que '[NSNumber numberWithChar: 73]', en lugar de uno que produce un objeto con un 'long long' y el otro un objeto respaldado por un 'char'. Ahora que me molesto en volver a verificar, este no es el caso en 10.6.4. (Puede verificar esto con 'CFShow()', que le indica la representación interna). –