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;