iOS: сравнение NSInteger и NSUInteger
Сюрприз!
У меня есть такая переменная,
NSInteger index = 0;
Я сравниваю его с одним из подсчетов (который возвращает NSUInteger
) как это,
if((index-1) <= [[currentmonth subviews] count])
{
NSLog(@"true");
}
else
{
NSLog(@"false");
}
Это всегда даёт ложь.
но если я сделаю так,
if ((index-1) <= 42) {
NSLog(@"true");
} else {
NSLog(@"false");
}
Это всегда даёт правду.
Я чувствую это, потому что мы не можем сравнивать NSInteger
с NSUInteger
правильный?
Я поймал эту проблему, когда у меня есть рабочее решение, основанное на этой логике. Но это совсем не так.
1 ответ
Я нашел это, NSUInteger против NSInteger, INT против без знака, и подобные случаи
Этот ответ дает хорошие объяснения по этому поводу!
Вы также должны знать о правилах целочисленного преобразования при работе с NSUInteger против NSInteger:
Следующий фрагмент, например, возвращает 0 (false), хотя можно ожидать, что он напечатает 1 (true):
NSInteger si = -1;
NSUInteger ui = 1;
printf("%d\n", si < ui);
Причина в том, что переменная [si] неявно преобразуется в беззнаковое целое!
См . Сайт безопасного кодирования CERT для более глубокого обсуждения этих "проблем" и способов их решения.