2011-04-20 13 views
12

Lo siento por tal pregunta general, pero ¿cuál es la mejor (lo más rápido posible y la mayor seguridad) método para convertir int a flotar en ObjC:Objetivo C int La conversión a flote

Primera

int b = 10; 
float a = [[NSNumber numberWithInt: b] floatValue] 

Habrá NSNumber instancia y se enviarán los mensajes numberWithInt, floatValue, ¿verdad?

Segunda

int b = 10; 
float a = (float) b; 

estilo C: esto con alguna llamada de subrutina?

¿O alguna otra manera?

¿Y por qué?

+0

Usa el elenco. No llama a una subrutina. El compilador se asegurará de que se use el código de ensamblaje correcto. – hooleyhoop

+5

No use el yeso. Un simple 'float a = b;' basta. – pmg

Respuesta

12

El modelo de estilo C es el más claro y fácil de leer. Si encuentro un código que creó un objeto NSNumber solo para que haga la conversión, me dejaría preguntándome "¿Por qué lo hizo de esa manera? ¿Está sucediendo algo aquí aparte de una simple conversión de tipo antiguo? ¿Qué me estoy perdiendo? "

En cuanto a la velocidad, sospecho que la conversión de tipo simple también sería más rápida: el objeto NSNumber tendrá que realizar las mismas operaciones para realizar la conversión, y tiene la sobrecarga adicional de creación de objetos y mensajes en la parte superior ese. Pero como en todos esos casos, no adivine, mida. Perfile su código para ver si la conversión es un cuello de botella que es lo suficientemente significativo como para ser digno de su atención.

+0

Solo quiero rellenar la estructura 'CGRect' unas 10 veces y encontré que no sé cómo convertir de la mejor manera –

+1

La pregunta entonces es, ¿llenarlo con qué? Si los está rellenando con valores literalmente codificados, simplemente puede escribir 'NSMakeRect (1.0, 1.0, 1.0, 1.0)', sin necesidad de conversión. Por otro lado, si estás leyendo datos de un plist, obtendrás un objeto NSNumber de todos modos, así que simplemente llama a su método '-floatValue'. Escribir el valor de retorno de '-intValue' no lograría nada más que una ofuscación sin sentido. La forma más simple es casi siempre la mejor. –

+0

Lo estoy haciendo en el ciclo 'for' desde que obtengo el valor int y paso esto a la estructura' CGRect' –

2

Realmente no veo la necesidad de un objeto NSNumber cuando está disponible un encasillado directo entre dos primitivas numéricas. La clase NSNumber no estaba destinada únicamente a la conversión de tipos de todos modos.

5

Como usted pregunta por seguridad, lo primero que necesita verificar es si el valor de su int cabe en un float. De lo contrario, estás perdiendo datos en silencio. A menos que el valor sea muy pequeño, no cabrá. Me gustaría cambiar al uso de double por lo que no tiene que preocuparse por esto, entonces sólo hacer la misión:

double d; 
d = i; 

Pocas veces existe ningún uso para las variables de tipo float, al igual que short ...

+0

-1 El valor máximo para un flotante es _much_ más grande que el valor máximo para un int. El máximo para un flotante se define como 3.40282347 x 10^38, mientras que el máximo para un int se define como 2147483647, que hace que el valor máximo para un flotador 1.58456316 × 10^29 veces más grande – nick

+3

@nick: Solo porque el valor máximo es mayor no no significa que cualquier 'int' se ajuste en un' float'. Un 'float' (precisión simple IEEE) solo tiene 24 bits de valor para la mantisa. Esto significa que si un entero es mayor que 2^24-1, solo cabe en un flotante si los bits bajos son todos cero. Es decir, '0x1fffffe' se ajusta pero' 0x1ffffff' no. Si no me crees, intenta convertir el último en flotador y viceversa, y verás que el valor ha cambiado. (Si estás en x86 con GCC, asegúrate de usar '-ffloat-store' o puede que no se convierta realmente). –

+0

Tienes razón, nunca lo supe y me disculpo, pero me pareció un poco extraño yo. Estoy tratando de eliminar el -1, pero me dice que el voto está bloqueado en :( – nick