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 для более глубокого обсуждения этих "проблем" и способов их решения.

Другие вопросы по тегам