NSUInteger по сравнению с NSInteger, интервал по сравнению с неподписанными, и подобными случаями

У кого-либо есть экспертные знания для объяснения, когда использовать NSUInteger и когда использовать NSInteger?

Я видел, что методы Какао возвратили NSInteger даже в случаях, где возвращенное значение всегда будет не подписано.

Какова фундаментальная причина? NSInteger или интервал строго ограничены тем, если мы хотим представить отрицательную величину?

От NSObjCRuntime.h:

#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
29
задан Jesse Armand 31 March 2010 в 23:47
поделиться

3 ответа

Вы также должны знать правила преобразования целых чисел при работе с NSUInteger vs. NSInteger:

Следующий фрагмент, например, возвращает 0 (ложь), хотя вы ожидали, что он напечатает 1 ( true):

NSInteger si = -1;
NSUInteger ui = 1;
printf("%d\n", si < ui);

Причина в том, что переменная [si] неявно преобразуется в беззнаковое int!

См. сайт безопасного кодирования CERT , где подробно обсуждаются эти «проблемы» и способы их решения.

31
ответ дан 28 November 2019 в 01:17
поделиться

Если ваш метод имеет достаточно ограниченный диапазон вывода, вы можете использовать NSInteger, поскольку его проще набирать. Как вы говорите, если вам нужно возвращать отрицательные числа, NSInteger - единственная игра в городе; я бы использовал NSUInteger, только если бы мне по какой-то причине нужно было возвращать действительно большие числа.

7
ответ дан 28 November 2019 в 01:17
поделиться

Я не знаю конкретно о какао, но обычно единственным недостатком целых чисел со знаком является то, что они обычно имеют половину максимального значения в виде целого числа без знака. Например, около 2 миллиардов вместо 4 миллиардов для 32-битных систем. Как правило, это не большая разница, поскольку, если вы имеете дело со значениями, близкими к 2 миллиардам, вы, вероятно, были бы так же обеспокоены максимальным значением 4 миллиарда в том же случае, поскольку это все еще довольно близко к переполнению с помощью всего лишь одного умножение на 2 или 3.

Целые числа со знаком обычно предпочтительны, потому что дополнительная гибкость и тот факт, что целое число со знаком может использоваться почти во всех сценариях, целое число без знака может плюс все дополнительные сценарии, которые не могут быть там, где требуется отрицательное значение.

Беззнаковый может быть предпочтительнее, если вы хотите принудительно применять только положительные значения.

5
ответ дан 28 November 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: