Странное преобразование из NSUInteger в float - PullRequest
0 голосов
/ 28 сентября 2010

У меня есть следующий код:

NSUInteger one = 1;
CGPoint p = CGPointMake(-one, -one);
NSLog(@"%@", NSStringFromCGPoint(p));

Его вывод:

{4.29497e+09, 4.29497e+09}

С другой стороны:

NSUInteger one = 1;
NSLog(@"%i", -one); // prints -1

Я знаю, что, вероятно, какой-топроисходит переполнение, но почему эти два случая отличаются и почему это не работает так, как я хочу?Должен ли я всегда напоминать себе о конкретном числовом типе моих переменных и выражений даже при выполнении тривиальной арифметики?

PS Конечно, я мог бы использовать unsigned int вместо NSUInteger, без разницы.

Ответы [ 2 ]

1 голос
/ 28 сентября 2010

Когда вы применяете унарный - к значению без знака, значение без знака отменяется, а затем принудительно возвращается к неподписанному набору путем повторного добавления Utype_MAX + 1 к этому значению.Когда вы передаете это CGPointMake(), это (очень большое) беззнаковое значение затем присваивается CGFloat.

. Вы не видите этого в своем операторе NSLog(), поскольку вы регистрируете его какцелое число со знакомПреобразуйте это обратно в целое число со знаком, и вы действительно получите -1.Попробуйте использовать NSLog("%u", -one), и вы поймете, что вернулись на 4294967295.

unsigned int против NSUInteger ВЛИЯЕТ на разницу: unsigned int в два раза меньше NSUInteger подархитектура LP64 (x86_64, ppc64) или когда вы компилируете с определением NS_BUILD_32_LIKE_64.NSUInteger всегда имеет размер указателя (но используйте uintptr_t, если вам действительно нужно целое число размером с указатель!);unsigned не при использовании модели LP64.

0 голосов
/ 28 сентября 2010

ОК, даже не зная, но читая в сети обо всех этих типах данных, я бы сказал, что проблема была в преобразовании из NUSInteger (который разрешает либо int (x32), либо long (x64))в CGFloat (который разрешается либо с плавающей точкой (x32), либо с двойным (x64)).

В вашем втором примере такого же преобразования не происходит.Другая вещь, которая может повлиять на это, состоит в том, что из моего прочтения NSUinteger не предназначен, чтобы содержать отрицательные числа, только положительные.Так что, вероятно, именно там все и пойдет не так.

...