NSUInteger vs NSInteger, int vs unsigned, et cas similaires

Quelqu’un a-t-il l’expertise nécessaire pour expliquer quand utiliser NSUInteger et quand utiliser NSInteger?

J’avais déjà vu des méthodes Cocoa renvoyer NSInteger même dans les cas où la valeur renvoyée serait toujours non signée.

Quelle est la raison fondamentale? NSInteger ou int est-il ssortingctement limité à si nous voulons représenter une valeur négative?

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 

Vous devez également connaître les règles de conversion d’entier lorsque vous utilisez NSUInteger contre NSInteger:

Le fragment suivant, par exemple, renvoie 0 (false) bien que vous vous attendiez à ce qu’il en imprime 1 (true):

 NSInteger si = -1; NSUInteger ui = 1; printf("%d\n", si < ui); 

La raison en est que la variable [si] est implicitement convertie en un unsigned int!

Consultez le site de codage sécurisé de CERT pour une discussion approfondie sur ces «problèmes» et sur la façon de les résoudre.

Par défaut, un entier est supposé être signé. En d’autres termes, le compilateur suppose qu’une variable entière sera appelée pour stocker un nombre négatif ou positif. Cela limite la scope que la plage peut atteindre dans les deux sens. Par exemple, un int de 32 bits a une plage de 4 294 967 295. En pratique, comme la valeur peut être positive ou négative, la plage va en réalité de -2 147 483 648 à + 2 147 483 647. Si nous soaps qu’une variable ne sera jamais appelée à stocker une valeur négative, nous pouvons la déclarer comme non signée, ce qui étend la plage (positive) de 0 à +4 294 967 295. Je dirais donc que l’utilisation de NSInteger est acceptable si vous savez que vous avez une plage de sortie restreinte. Personnellement, j’utilise NSUInteger si je devais renvoyer de gros chiffres uniquement positifs

Si votre méthode a une plage de sortie suffisamment restreinte, vous pouvez également utiliser NSInteger car il est plus facile à taper. Comme vous le dites, si vous devez renvoyer des nombres négatifs, NSInteger est le seul jeu en ville. J’utiliserais NSUInteger si j’avais besoin de renvoyer de très gros nombres pour une raison quelconque.

Je ne connais pas spécifiquement le cacao, mais le seul inconvénient des entiers signés est qu’ils ont généralement la moitié de la valeur maximale en tant qu’un unsigned int. Par exemple, environ 2 milliards au lieu de 4 milliards pour les systèmes 32 bits. En général, la différence est minime, car si vous aviez affaire à des valeurs proches de 2 milliards, vous seriez probablement tout aussi inquiet pour un maximum de 4 milliards dans le même cas, puisqu’il est toujours proche d’un débordement avec juste multiplication de 2 ou 3.

Les entiers signés sont généralement préférés en raison de la flexibilité supplémentaire et du fait qu’un entier signé peut être utilisé dans presque tous les scénarios qu’un entier non signé peut associer à tous les scénarios supplémentaires dans lesquels un négatif n’est pas nécessaire.

Il peut être préférable d’utiliser Unsigned si vous souhaitez appliquer des valeurs positives uniquement.