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?
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;
É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
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
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
}
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;