2013-03-14 2 views

ответ

4

Использование спецификатора формата %d заставляет целое число без знака быть проинформировано, как если бы оно было подписано.

Изменение:

NSLog(@"Index: %d", index); 

к:

NSLog(@"Index: %u", index); 

, и он будет отображаться правильно.

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

+0

Почему анонимный голос, интересно? –

+0

Я думаю, потому что вы к тому же. Он не должен регистрировать ничего вообще, поскольку -1 меньше 0. По крайней мере, так я его прочитал. – nickdnk

+0

@nickdnk: ОК - спасибо - теперь я вижу, что с кодом есть две проблемы, и на 100% не понятно, к какой проблеме относится OP. –

1

Проблема в том, что «integer» ничего не знает о своей функции с подписью/без знака. Это просто бит. -1 постоянна со значением 0xFFFFFFFF.

Тип «знает», если он подписан/без знака, и правильная команда для процессора испускается при компиляции.

NSUInteger index = -1; // effectively translates to index = 0xFFFFFFFF; (all bits set) 

if (index > 0) { // unsigned comparison - well, anything else than zero in unsigned comparison is bigger than zero 
    // so probably the JA (jump if above) asm instruction is emitted. 
    // if the index was NSInteger, JG will be emitted. 

    NSLog(@"Index: %d", index); // as others stated, you're now passing the bits of 'index' in way the NSLog treats them as signed integer 

} 
Смежные вопросы