2011-08-07 10 views

Respuesta

32

NSInteger y NSUInteger son sólo typedefs de los 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 es necesario "convertir" entre ellos. Un elenco simple debería ser suficiente. Al igual que:

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

Gratzi, el segundo poco de código no funcionó para mí! –

+3

¿No es peligroso enviar un int firmado a un int sin firmar? Leí que puede causar corrupción ya que un bit de signo puede interpretarse como un valor en ints sin signo. ¿O C todo el trabajo para evitar que eso suceda? –

8

ya que esto podría ser útil para otros viene a través de este tema aquí es una pequeña tabla que muestra el efecto real de la fundición. Estos valores se tomaron directamente del depurador como valores hexadecimales. Elija en consecuencia, ya que puede ver que el casting causa efectos. Para 32-bit, cortar la parte inferior ffffffff y para 16-bit lop de fondo ffffffffffff. También tenga en cuenta que -1 es siempre 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 
3

Si está seguro de que su NSInteger es mayor que o igual a cero, sólo tiene que proyectarlo como NSUInteger. No se le debe casting para NSUInteger si su NSInteger representa un número negativo, ya que puede dar lugar a incoherencias.

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

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

en NSObjCRuntime.h '#define NSUIntegerMax ULONG_MAX' ' NSLog (@ "ULONG_MAX:% lu", ULONG_MAX);' ' ULONG_MAX: 4294967295' 4294967295-30 + 1 = 4294967266 +1 debido a ' ui NSInteger = NSIntegerMax; '' ui = -1; '' ui = (NSUInteger) -1; ' –

0

Si estás interesado en convertir un entero a un entero sin signo, que son ya sea en una situación donde se sabe que el número entero nunca será negativo , o puede que desee que todos los valores negativos se conviertan en valores absolutos (es decir, valores sin signo). Hacer esto conversión a un valor absoluto es sencillo:

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

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

Se mostrarían posibles casos de uso para dicha función donde indicará los valores negativos en un formato diferente. Por ejemplo, en la contabilización de 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, que podría simplemente asignar una NSInteger a un NSUInteger-esto ni siquiera requiere un yeso, pero cuando el NSInteger es negativo, el NSUInteger devolverá un número muy grande positivo, lo que es claramente un efecto secundario muy poco deseable:

NSUInteger myUnsignedInteger = mySignedInteger; 
Cuestiones relacionadas