objective-c nsinteger nsuinteger

objective c - Convertir NSInteger a NSUInteger?



objective-c (4)

Estoy tratando de convertir un NSInteger a un NSUInteger y lo busqué en Google y no encontré una respuesta real. ¿Cómo haría esto?


Si desea convertir un entero en un entero sin signo, se encuentra en una situación en la que sabe que el entero nunca será negativo, o puede desear que todos los valores negativos se conviertan a valores absolutos (es decir, valores sin signo) . Hacer esta conversión a un valor absoluto es sencillo:

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

fabs() es una función de C que devuelve un valor absoluto para cualquier flotante. Aquí, myUnsignedInteger tendría un valor de 100.

Los posibles casos de uso de una función de este tipo se mostrarán donde usted indicará los valores negativos en un formato diferente. Por ejemplo, en contabilidad los números negativos se muestran entre paréntesis:

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

Tenga en cuenta que, desde un punto de vista técnico, simplemente podría asignar un NSInteger a un NSUInteger (esto ni siquiera requiere una conversión), pero cuando el NSInteger es negativo, el NSUInteger devolverá un número positivo muy grande, que es claramente un lado altamente indeseable. efecto:

NSUInteger myUnsignedInteger = mySignedInteger;


Si está seguro de que su NSInteger es mayor o igual a cero, simplemente lo NSUInteger en NSUInteger . No debe NSUInteger a NSUInteger si su NSInteger representa un número negativo, ya que puede llevar a una inconsistencia.

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

resultados 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 }


Ya que esto podría ser útil para otros que surjan de este problema, aquí hay una pequeña tabla que muestra el efecto real del lanzamiento. Estos valores se tomaron directamente del depurador como valores hexadecimales. Elige en consecuencia, como puedes ver, el casting causa efectos. Para 32 bits, corte la parte inferior del ffffffff y para 16 bits corte la parte inferior del ffffffffffff . También tenga en cuenta, -1 es siempre 0xffffffffffffffffff.

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


NSInteger y NSUInteger son simplemente typedefs para tipos enteros primitivos:

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

Como tal, no necesitas "convertir" entre ellos. Un simple reparto debe ser suficiente. Me gusta:

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