2010-09-19 13 views
8

Tak więc w zasadzie moje pytanie jest takie, że tworzę obiekt NSMutableDictionary przy użyciu obiektów uint64_t jako klucza.Konwertowanie (u) int64_t na NSNumbers

Czy istnieje lepszy sposób ich tworzenia niż wykonanie tego?

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 

to będzie działać tak długo, jak nie obejmują go w binarnym pliku/gniazd/NSData obiektu/cokolwiek. Ale czy istnieje lepszy sposób na zrobienie tego? Naprawdę chciałbym mieć pewność, że obiekt jest 64-bitowy niezależnie od platformy, na której go uruchomiłem.

Chyba mogę tylko uniknąć cały problem, zawsze będzie unsigned long long, ale oczywiście, że odpady mnóstwo przestrzeni sterty na 64-bitowych maszynach gdybym przeznaczyć te obiekty znaczących liczb ....

Odpowiedz

16

long long jest 64-bitowy na 64-bitowych platformach OS X/iOS. Na wszystkich platformach OpenStep, numberWithUnsignedLongLong: jest poprawna dla uint64_t.

Ostatnim razem sprawdziłem, która metoda stosowana w fabrykach w rzeczywistości nie wpływa na reprezentację; zależy tylko od wartości liczby (chyba że użyjesz zbyt małego rozmiaru, powodując jego obcięcie).

Aktualizacja: w tych dniach prawidłową odpowiedzią jest NSNumber *bobsNumber = @(bob);.

+0

Powodem, dla którego nie ma znaczenia, jest to, że kompilator wie najlepiej o rzeczywistych bitach używanych typów. Jeśli się nie zgadzają, jeden jest konwertowany na drugi - albo przez przycinanie bitów, albo przez rozszerzanie z wiodącymi zerami. –

+0

Nieporozumienie. W drugim akapicie mam na myśli to, że '[NSNumer numberWithLongLong: 73]' wytworzyłby ten sam obiekt, co '[NSNumber numberWithChar: 73]', zamiast jednego odtwarzającego obiekt z powrotem przez 'long long' i drugi obiekt wspierane przez 'char'. Teraz, gdy próbuję ponownie sprawdzić, nie jest tak w 10.6.4. (Możesz to sprawdzić za pomocą 'CFShow()', która mówi ci o wewnętrznej reprezentacji.) –