Это сведет меня с ума:NSUInteger меньше 0, почему?
NSUInteger index = -1;
if (index > 0) {
NSLog(@"Index: %d", index);
}
Почему журнал:
2013-03-14 14:31:15.418 Demo[6155:907] Index: -1
???
Это сведет меня с ума:NSUInteger меньше 0, почему?
NSUInteger index = -1;
if (index > 0) {
NSLog(@"Index: %d", index);
}
Почему журнал:
2013-03-14 14:31:15.418 Demo[6155:907] Index: -1
???
Использование спецификатора формата %d
заставляет целое число без знака быть проинформировано, как если бы оно было подписано.
Изменение:
NSLog(@"Index: %d", index);
к:
NSLog(@"Index: %u", index);
, и он будет отображаться правильно.
В качестве альтернативы просто используйте NSInteger
, если вам действительно не нужно значение без знака.
Проблема в том, что «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
}
Почему анонимный голос, интересно? –
Я думаю, потому что вы к тому же. Он не должен регистрировать ничего вообще, поскольку -1 меньше 0. По крайней мере, так я его прочитал. – nickdnk
@nickdnk: ОК - спасибо - теперь я вижу, что с кодом есть две проблемы, и на 100% не понятно, к какой проблеме относится OP. –