web-dev-qa-db-fra.com

Convertir NSInteger en NSUInteger?

J'essaye de convertir un NSInteger en NSUInteger et je l'ai cherché sur Google sans trouver de réponse réelle. Comment je ferais ça?

21
SimplyKiwi

NSInteger et NSUInteger ne sont que des types pour les types entiers primitifs:

#if __LP64__ || NS_BUILD_32_LIKE_64
  typedef long NSInteger;
  typedef unsigned long NSUInteger;
#else
  typedef int NSInteger;
  typedef unsigned int NSUInteger;
#endif

En tant que tel, vous n'avez pas besoin de "convertir" entre eux. Un simple casting devrait suffire. Comme:

NSInteger myInt = 0;
NSUInteger unsignedInt = (NSUInteger)myInt;
32
aroth

Étant donné que cela pourrait être utile pour d’autres problématiques à venir, voici un petit tableau montrant l’effet réel du casting. Ces valeurs ont été extraites directement du débogueur en tant que valeurs hexadécimales. Choisissez en conséquence, comme vous pouvez le constater, le casting provoque des effets. Pour 32 bits, coupez le fond ffffffff et 16 bits, coupez le bas ffffffffffff . Notez également que -1 est toujours 0xffffffffffffffff. 

NSInteger si = NSIntegerMax;    // si   NSInteger   0x7fffffffffffffff
si = -1;                        // si   NSInteger   0xffffffffffffffff
si = (NSInteger)-1;             // si   NSInteger   0xffffffffffffffff
si = (NSUInteger)-1;            // si   NSInteger   0xffffffffffffffff
si = NSUIntegerMax;             // si   NSInteger   0xffffffffffffffff
si = (NSInteger)NSIntegerMax;   // si   NSInteger   0x7fffffffffffffff
si = (NSUInteger)NSIntegerMax;  // si   NSInteger   0x7fffffffffffffff
si = (NSInteger)NSUIntegerMax;  // si   NSInteger   0xffffffffffffffff
si = (NSUInteger)NSUIntegerMax; // si   NSInteger   0xffffffffffffffff

NSUInteger ui = NSUIntegerMax;  // ui   NSUInteger  0xffffffffffffffff
ui = -1;                        // ui   NSUInteger  0xffffffffffffffff
ui = (NSInteger)-1;             // ui   NSUInteger  0xffffffffffffffff
ui = (NSUInteger)-1;            // ui   NSUInteger  0xffffffffffffffff
ui = NSIntegerMax;              // ui   NSUInteger  0x7fffffffffffffff
ui = (NSInteger)NSIntegerMax;   // ui   NSUInteger  0x7fffffffffffffff
ui = (NSUInteger)NSIntegerMax;  // ui   NSUInteger  0x7fffffffffffffff
ui = (NSInteger)NSUIntegerMax;  // ui   NSUInteger  0xffffffffffffffff
ui = (NSUInteger)NSUIntegerMax; // ui   NSUInteger  0xffffffffffffffff
8
tgunr

Si vous êtes certain que votre NSInteger est supérieur ou égal à zéro, il vous suffit de le lancer sous la forme NSUInteger. Vous ne devriez pas utiliser la variable NSUInteger si votre NSInteger représente un nombre négatif, car cela pourrait entraîner une incohérence.

NSInteger signedInteger = -30;
NSUInteger unsignedInteger = (NSUInteger)signedInteger;

résulte en

integer results

if (unsignedInteger == signedInteger) {
    // is TRUE
}
if (signedInteger == 4294967266) {
    // is FALSE
}
if (signedInteger == -30) {
    // is TRUE
}
if (unsignedInteger == 4294967266) {
    // is TRUE
}
if (unsignedInteger == -30) {
    // is TRUE
}
3
Brian

Si vous souhaitez convertir un entier en entier non signé, vous êtes soit dans une situation où vous savez que cet entier ne sera jamais négatif, soit vous voudrez peut-être que toutes les valeurs négatives soient converties en valeurs absolues (c'est-à-dire, des valeurs non signées). . Faire cette conversion en une valeur absolue est simple:

NSInteger mySignedInteger = -100;
NSUInteger myUnsignedInteger = fabs(mySignedInteger);

fabs() est une fonction C qui renvoie une valeur absolue pour tout float. Ici, myUnsignedInteger aurait une valeur de 100.

Les cas d'utilisation possibles pour une telle fonction sont les suivants: vous indiquez les valeurs négatives dans un format différent. Par exemple, en comptabilité, les nombres négatifs sont affichés entre parenthèses:

NSString * numberForDisplay;
if (mySignedInteger < 0) {
    numberForDisplay = [NSString stringWithFormat:@"(%lu)", myUnsignedInteger];
} else {
    numberForDisplay = [NSString stringWithFormat:@"%lu", myUnsignedInteger];
}

Notez que d'un point de vue technique, vous pouvez simplement affecter un NSInteger à un NSUInteger (cela ne nécessite même pas de transtypage), mais lorsque NSInteger est négatif, NSUInteger renverra un très grand nombre positif, ce qui est clairement un côté hautement indésirable effet:

NSUInteger myUnsignedInteger = mySignedInteger;
0
Duncan Babbage