Objetivo C. Lanzar int a float

4 minutos de lectura

Perdón por una pregunta tan general, pero cuál es el mejor método (lo más rápido posible y más seguro) para convertir int en float en ObjC:

Primero

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

Habrá NSNumber instancia y mensajes numberWithInt, floatValue será enviado, ¿verdad?

Segundo

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

Estilo C: ¿esto con llamar a alguna subrutina?

¿O de alguna otra manera?

¿Y por qué?

  • Usa el yeso. No llama a una subrutina. El compilador se asegurará de que se use el código ensamblador correcto.

    – alboroto

    20 de abril de 2011 a las 11:16


  • No uses el yeso. Una llanura float a = b; es suficiente

    – pmg

    20 de abril de 2011 a las 12:01

Avatar de usuario de Sherm Pendley
Sherm Pendley

El tipo de letra de estilo C es el más claro y fácil de leer. Si por casualidad encontrara un código que creara un NSNumber objeto solo para que haga la conversión, me dejaría preguntándome “¿Por qué lo hizo de esa manera? ¿Está sucediendo algo aquí que no sea 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 NSNumber El objeto deberá realizar prácticamente las mismas operaciones para realizar la conversión, y tiene la sobrecarga adicional de creación de objetos y mensajería además de eso. Pero como en todos estos casos, no adivine: mida. Perfile su código para ver si la conversión es un cuello de botella lo suficientemente significativo como para merecer su atención.

  • Solo quiero llenar el CGRect struct alrededor de 10 veces y descubrí que no sé cómo convertir de la mejor manera

    usuario663896

    20 de abril de 2011 a las 10:58


  • La pregunta entonces es, ¿llenarlo con qué? Si los está llenando con valores codificados literales, simplemente puede escribir NSMakeRect(1.0, 1.0, 1.0, 1.0), sin conversión necesaria. Por otro lado, si está leyendo datos de un plist, obtendrá un objeto NSNumber de todos modos, así que simplemente llame a su -floatValue método. Escriba la conversión del valor de retorno de -intValue no lograría nada más que una ofuscación sin sentido. La forma más sencilla es casi siempre la mejor.

    – Sherm Pendley

    20 de abril de 2011 a las 11:04


  • lo estoy haciendo en for Ciclo de Obtengo valor int y paso esto a CGRect estructura

    usuario663896

    20 de abril de 2011 a las 11:08

  • Entonces solo usa un tipo de conversión. Es el más claro y fácil de leer, y si solo lo haces diez veces, hay absolutamente no razón para perder el tiempo tratando de “optimizarlo”.

    – Sherm Pendley

    20 de abril de 2011 a las 11:15

R.. GitHub DEJAR DE AYUDAR Avatar de usuario de ICE
R.. GitHub DEJAR DE AYUDAR A ICE

Ya que pregunta por la seguridad, lo primero que debe verificar es si el valor de su int cabe en un float. De lo contrario, está perdiendo datos en silencio. A menos que el valor sea bastante pequeño, no encajará. cambiaría a usar double para que no tenga que preocuparse por esto, simplemente haga la asignación:

double d;
d = i;

Raramente hay algún uso para variables de tipo floatMuy parecido short

  • -1 El valor máximo para un flotante es mucho mayor 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, lo que hace que el valor máximo para un flotante sea 1,58456316 × 10^29 veces mayor

    – mella

    25 de abril de 2012 a las 19:33


  • @nick: El hecho de que el valor máximo sea mayor no significa que int cabe en un float. A float (IEEE de precisión simple) solo tiene 24 bits de valor para la mantisa. Esto significa que si un número entero es mayor que 2^24-1, solo cabe en un flotante si los bits bajos son todos cero. Es decir, 0x1fffffe encaja pero 0x1ffffff no es. Si no me cree, intente convertir este último en flotante y viceversa y verá que el valor ha cambiado. (Si está en x86 con GCC, asegúrese de usar -ffloat-store o es posible que en realidad no se convierta).

    – R.. GitHub DEJA DE AYUDAR A ICE

    26 de abril de 2012 a las 3:20

  • Tienes razón, nunca supe eso y te pido disculpas, pero me pareció un poco extraño. Estoy tratando de quitar el -1, pero me dice que el voto está bloqueado 🙁

    – mella

    26 de abril de 2012 a las 16:04

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

¿Ha sido útil esta solución?