Есть ли какие-либо проблемы с приведением 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-битной.

Другие вопросы по тегам