Могу ли я безопасно хранить UInt32 для NSUInteger? - PullRequest
3 голосов
/ 02 мая 2010

В шапке это определяется как:

#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

Так что UInt32 без проблем помещается в NSUInteger (без знака int)? В чем разница между UInt32 и unsigned int?

И я предполагаю, что unsigned long больше, чем unsigned int?

Ответы [ 2 ]

9 голосов
/ 02 мая 2010

Полагаю, единственная разница между UInt32 и unsigned int заключается в том, что UInt32 гарантированно будет иметь длину 32 бита, тогда как технически unsigned int может быть короче, если вы работаете (скажем) на <32-разрядная операционная система. </p>

Однако, учитывая, что Mac и iPhone являются как минимум 32-разрядными системами, можно безопасно использовать unsigned int, UInt32 и NSUInteger с разумной взаимозаменяемостью. Единственное отличие здесь в том, что NSUInteger может иметь длину 64 бита (на Mac при компиляции для x86_64).

Что касается вашего вопроса unsigned long против unsigned int, UInt32 является typedef'd для unsigned long, снова указывая на то, что его можно использовать взаимозаменяемо. unsigned long гарантированно будет по крайней мере таким же большим, как unsigned int.

1 голос
/ 03 мая 2010

Вы всегда можете добавить код проверки среды в начальную часть вашей программы, чтобы минимизировать неожиданность:

 if (sizeof(NSUInteger) != sizeof(UInt32)) {
     printf("Error: Wrong integer type size!\n");
     exit(0);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...