Подтвердить что ты не робот

NSUInteger vs NSInteger, int vs без знака и аналогичные случаи

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

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

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

Из 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
4b9b3361

Ответ 1

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

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

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

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

Смотрите сайт CERT Secure Coding для углубленного обсуждения этих "проблем" и их решения.

Ответ 2

По умолчанию предполагается, что целое число будет подписано. Другими словами, компилятор предполагает, что целочисленная переменная будет вызываться для сохранения отрицательного или положительного числа. Это ограничивает то, что диапазон может достигать в любом направлении. Например, 32-битный int имеет диапазон 4 294 967 295. На практике, поскольку значение может быть положительным или отрицательным, диапазон на самом деле составляет -2147,483,648 до +2,147,483,647. Если мы знаем, что переменная никогда не будет вызвана для хранения отрицательного значения, мы можем объявить ее как unsigned, тем самым расширяя (положительный) диапазон до 0 до +4 294 967 295. Поэтому я бы сказал, что можно использовать NSInteger, когда вы знаете, что у вас ограниченный диапазон выходных данных. Я лично использую NSUInteger, если мне нужно вернуть действительно большие положительные числа

Ответ 3

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

Ответ 4

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

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

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