Какао: NSUInteger против unsigned int Когда диапазон очень мал? - PullRequest
0 голосов
/ 03 апреля 2010

У меня есть переменная int без знака, и она может иметь только значения 0 -> 30. Что я должен использовать: unsigned int или NSUInteger? (для 32 и 64 бит)

Ответы [ 5 ]

3 голосов
/ 03 апреля 2010

Я бы выбрал либо NSUInteger (как идиоматический общий тип целого без знака в какао), либо uint8_t (если размер имеет значение). Если бы я ожидал использовать 0–30 значений в нескольких местах для одного и того же типа данных, я бы набрал его, чтобы описать, что он представляет.

1 голос
/ 03 апреля 2010

Запуск этого:


    int sizeLong = sizeof(unsigned long);
    int sizeInt = sizeof(unsigned int);
    NSLog(@"%d, %d", sizeLong, sizeInt);

на 64бит дает: 8, 4 на 32 бита дает: 4, 4 Так что да, для 64-битного unsigned long (NSUInteger) занимает в два раза больше памяти, чем NSUInteger для 32-битного.

0 голосов
/ 12 мая 2014

Лично меня только что укусил этот выбор. Я пошел по маршруту NSUInteger и только что потратил ЧАСЫ, изучая неясную ошибку.

У меня был код, который выбрал случайное число и вернул NSUInteger. Код для полагался на переполнение номера. Однако я не ожидал, что размер числа будет варьироваться между 32-битными и 64-битными системами. Остальная часть моего кода предполагала (неверно), что число будет иметь размер до 32 бит. В результате код отлично работал на 32-битных устройствах, но на iPhone 5S все развалилось.

Нет ничего плохого в использовании NSUInteger, однако стоит помнить, что диапазон чисел значительно выше, поэтому учитывайте динамизм в любой математике, которую вы делаете с этим числом.

0 голосов
/ 03 апреля 2010

Когда вы действительно хотите использовать некоторые типы без знака, выбор между unsigned int и NSUInteger не имеет значения, потому что эти типы равны (сравнивая диапазон и размер в 32 и 64 битах). То же самое относится к int и NSInteger:


#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
0 голосов
/ 03 апреля 2010

В вашем случае очень мало разницы, нет правильного или неправильного. Я мог бы использовать NSUInteger, просто чтобы соответствовать материалу API Какао.

NSUInteger определяется следующим образом:

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...