estoy tratando de convertir un NSInteger a un NSUInteger y lo busqué en Google y no encontró respuesta real. ¿Cómo haría esto?¿Convertir NSInteger a NSUInteger?
Respuesta
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;
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
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
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
}
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; ' –
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;
- 1. NSNotFound, NSInteger, NSUInteger y NSRange.location
- 2. Diferencia entre int, NSInteger y NSUInteger
- 3. Convertir NSInteger a NSIndexpath
- 4. Cómo convertir NSIndexPath a NSInteger?
- 5. cómo convertir NSinteger a String
- 6. NSString a NSUInteger
- 7. Cómo convertir un NSInteger a un int?
- 8. ¿Cómo puedo convertir un NSInteger a NSTimeInterval
- 9. ¿Cómo convertir un doble a NSInteger?
- 10. ¿Convierte NSString a NSInteger?
- 11. tipos NSInteger
- 12. conversión de NSNumber a NSInteger
- 13. Cómo convertir NSInteger a un valor binario (cadena)
- 14. ¿Cómo puedo revertir el orden de bytes de un NSInteger o NSUInteger en Object-C
- 15. Añadir NSInteger a NSMutableData
- 16. ¿Es posible enviar un NSInteger a NSNumber?
- 17. Cómo almacenar un NSUInteger usando NSCoding?
- 18. añadiendo objeto NSInteger a NSMutableArray
- 19. Xcode 4: nombre de tipo desconocido 'NSUInteger'; ¿Te refieres a 'NSUInteger'?
- 20. Cómo convertir NSIndexpath en NSInteger o simplemente int?
- 21. NSUEntero vs NSInteger, int vs unsigned, y casos similares
- 22. Pasando variables NSInteger a NSMutableDictionary o NSMutableArray
- 23. cuestión semántica: puntero incompatible a entero conversión enviar 'NSUInteger *' (también conocido como 'unsigned int *') al parámetro de tipo 'NSUInteger'
- 24. Comparar NSNumber con NSInteger
- 25. correctamente la conversión de NSString a CGFloat, NSInteger, etc
- 26. NSInteger cuenta por 4?
- 27. ¿Cómo comparar dos NSInteger?
- 28. Cómo convertir typedef enum a NSNumber?
- 29. ¿Por qué hay un NSInteger?
- 30. int vs NSNumber vs NSInteger
Gratzi, el segundo poco de código no funcionó para mí! –
¿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? –