2010-09-19 4 views
8

Итак, по сути, это мой вопрос: я создаю NSMutableDictionary, используя в качестве ключа объекты uint64_t.Преобразование (u) int64_t в NSNumbers

Есть ли лучший способ создать их, чем сделать это?

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 

Это будет работать до тех пор, как вы не включили его в бинарном файле/сокетов/NSData объекта/независимо. Но есть ли лучший способ сделать это? Я действительно хотел бы убедиться, что объект является 64-битным независимо от того, на какой платформе я запускаю его.

Я предполагаю, что я мог бы просто избежать весь вопрос, всегда происходит без знака долго долго, но, конечно, что отходы тонн кучного пространства на 64-битных машин, если я выделить эти объекты в значительном количестве ....

ответ

16

long long 64-бит на 64-битных платформах OS X/iOS. На всех платформах, открытых с OpenStep, numberWithUnsignedLongLong: подходит для uint64_t.

Последний раз, когда я проверил, какой метод фабрики вы используете, на самом деле не влияет на используемое представление; это зависит только от значения числа (если вы не используете слишком маленький размер, вызывая его усечение).

Обновление: в эти дни, правильный ответ NSNumber *bobsNumber = @(bob);.

+0

Причина, по которой это не имеет значения, заключается в том, что компилятор лучше знает о фактических битовых шинах используемых типов. Если они не совпадают, один преобразуется в другой - либо путем отсечения битов, либо путем расширения с ведущими 0. –

+0

Вы недопонимаете. Во втором абзаце я имею в виду, что '[NSNumber numberWithLongLong: 73]' будет генерировать тот же объект, что и '[NSNumber numberWithChar: 73]', а не один, производящий объект назад 'long long', а другой объект поддерживаемый символом 'char'. Теперь, когда я перехожу к повторной проверке, это не относится к 10.6.4. (Вы можете проверить это с помощью 'CFShow()', который сообщает вам внутреннее представление.) –