Y a-t-il des problèmes avec la diffusion de int32_t vers NSInteger ?
-
14-11-2019 - |
Question
Je crée un masque de bits pour iOS en utilisant le type de données int32_t.Ceci est ensuite défini sur une variable qui accepte un NSInteger.Cela ne génère aucune erreur de compilation comme prévu, mais je me demandais : existe-t-il un moyen pour que cela puisse provoquer des erreurs d'exécution à l'avenir ?
La solution
En général, cela fonctionnera.NSInteger aura toujours une longueur d'au moins 32 bits.S'il est de 64 bits, votre numéro sera étendu pour correspondre (vous devrez peut-être le convertir).Cela ne provoquera pas d’erreurs d’exécution.
Informations détaillées sur NSInteger
NSInteger est défini à l'aide du code suivant (de 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
Cela signifie que NSInteger
est équivalent à long
lors de la compilation pour 64 bits, un système d'exploitation intégré, iPhone, Windows ou lors de la construction de 32 bits comme 64 bits.Sinon, cela équivaut à int
.Depuis int
et int32_t
sont équivalents, tout ira bien dans les applications 32 bits sous OS X.Pour les autres situations, cela dépend de la taille de long
.
Dans les applications OS X 64 bits, long
est un nombre de 64 bits.Sur l'iPhone, long
est un nombre de 32 bits.Je ne connais pas Windows et je ne sais pas s'il utilise le format 32 bits ou 64 bits lors de la construction de 32 bits comme 64 bits.