2010-05-02 7 views
3

Dans l'en-tête, il est défini comme:Puis-je stocker en toute sécurité UInt32 sur NSUInteger?

#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 

donc fait un ajustement UInt32 sans problème dans un NSUInteger (un entier non signé)? Où est la différence entre UInt32 et unsigned int?

Et je suppose qu'un long non signé est plus grand qu'un entier non signé?

Répondre

9

Je suppose que la seule différence entre un UInt32 et un unsigned int est qu'un UInt32 est garanti d'être 32 bits de long, alors qu'un unsigned int pourrait techniquement être plus courte si vous utilisez (par exemple) sur un système < d'exploitation 32 bits. Cependant, étant donné que le Mac et l'iPhone sont tous les deux des systèmes 32 bits au moins, il est possible d'utiliser unsigned int, UInt32 et NSUInteger de façon raisonnablement interchangeable. La seule différence ici est qu'un NSUInteger peut avoir une longueur de 64 bits (sur Mac, lors de la compilation pour x86_64).

Quant à votre question de unsigned long par rapport unsigned int, UInt32 est typedef à un unsigned long, ce qui indique à nouveau qu'il est sûr d'utiliser de manière interchangeable. Un unsigned long est garanti être au moins aussi grand qu'un unsigned int.

1

Vous pouvez toujours ajouter un certain environnement code de vérification dans la partie initiale de votre programme pour réduire au minimum la surprise:

if (sizeof(NSUInteger) != sizeof(UInt32)) { 
    printf("Error: Wrong integer type size!\n"); 
    exit(0); 
} 
+0

Cela échouera sur les plates-formes 64 bits, où 'sizeof (NSUInteger)' retourne 8 et 'sizeof (UInt32) 'renvoie 4. –

+0

Donc, vous savez _when_ NSUInteger et UInt32 ne peuvent pas être traités de manière égale. – ohho

Questions connexes