Есть ли какие-либо проблемы с приведением int32_t к NSInteger? - PullRequest
4 голосов
/ 29 марта 2011

Я создаю битовую маску для iOS, используя тип данных int32_t.Затем устанавливается переменная, которая принимает NSInteger.Это не приводит к ошибкам времени компиляции, как ожидалось, но мне было интересно - есть ли какой-то способ, который может вызвать ошибки времени выполнения в будущем?

1 Ответ

7 голосов
/ 29 марта 2011

В общем, будет работать.NSInteger всегда будет иметь длину не менее 32 бит.Если оно составляет 64 бита, ваш номер будет дополнен знаком (возможно, вам придется его преобразовать).Это не приведет к ошибкам во время выполнения.


Подробная информация о NSInteger

NSInteger определяется с помощью следующего кода (из NSObjCRuntime.h):

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

Это означает, что NSInteger эквивалентно long при компиляции для 64-битной, встроенной ОС, iPhone, Windows или при сборке 32-битной, как 64-битной.В противном случае это эквивалентно int.Поскольку int и int32_t эквивалентны, вы будете в порядке в 32-разрядных приложениях на OS X. В других ситуациях это зависит от размера long.

В 64-разрядных приложениях OS Xlong - это 64-битное число.На iPhone long - это 32-битное число.Я не знаю о Windows, и я не уверен, использует ли она 32-битную или 64-битную длину при сборке 32-битной, как 64-битной.

...