Есть ли какие-либо проблемы с приведением int32_t к NSInteger?
Я создаю битовую маску для iOS, используя тип данных int32_t. Затем устанавливается переменная, которая принимает NSInteger. Это не приводит к ошибкам времени компиляции, как ожидалось, но мне было интересно - есть ли какой-нибудь способ, которым это может вызвать ошибки времени выполнения в будущем?
1 ответ
В общем, это будет работать. 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 X, long
это 64-битное число. На iPhone, long
это 32-битное число. Я не знаю о Windows, и я не уверен, использует ли она 32-битную или 64-битную длину при сборке 32-битной, как 64-битной.