¿Conversión entre flotación e int, representación en byte?

Tengo una pregunta que trata la diferencia en la representación entre un flotador y un byte en un sistema informático. Entonces, por ejemplo, ¿cómo se convierte un float de un float a, int y back; resulta en una representación completamente diferente de los bytes. ¿Hay algún recurso que pueda usar para señalarme en la dirección correcta? ¡Cualquier ayuda es muy apreciada! No puedo encontrar nada en línea, ¡un enlace en la dirección correcta sería muy útil!

La encoding más común de los números de punto flotante utiliza IEEE 754. Para los números de precisión simple, hay un bit (s) de signo, 8 bits de exponente (e) y 23 bits de fracción (f).

Para la mayoría de los valores de s, e y f, el valor representado es -1 s • 2 e-127 • F, donde F es el número que se obtiene al escribir “1” seguido de los 23 bits de f y luego interpretar eso cadena como un número binario. Por ejemplo, si f es 10000000000000000000000, entonces el número binario es 1.10000000000000000000000, que es (en decimal) 1.5, entonces F es 1.5.

Lo anterior se mantiene siempre que 0

Cuando e es 0, el valor representado es el mismo que el anterior, excepto que se inicia F con “0” en lugar de “1”. En particular, si f es cero, entonces el valor representado es cero. Si f no es cero, estos se denominan números denormales, porque son más pequeños que los valores normales representados en la forma primaria anterior.

Cuando e es 255 y f es 0, el valor representado es + infinito o infinito, de acuerdo con el bit de signo, s. Cuando e es 255 y f no es cero, el valor representado se denomina NaN, no es un número, que se utiliza para errores de depuración o captura u otros fines especiales. Hay NaN silenciosos (que no causan trampas; normalmente se usan cuando se desean continuar los cálculos para obtener un resultado final, luego se determina qué hacer con un NaN) y se señalan los NaN (que causan trampas; generalmente se usan) cuando desea abortar un cálculo porque se ha producido un error).

Puede haber variaciones en la forma en que aparece la encoding en diferentes plataformas, especialmente en el orden de los bytes dentro de los 32 bits. Y algunas plataformas no utilizan codificaciones IEEE 754.

La encoding de doble precisión utiliza el mismo esquema, excepto que e es de 11 bits, el 127 (denominado sesgo del exponente) se cambia a 1023 yf es de 52 bits. También el valor especial para el exponente es su máximo de 11 bits, 2047, en lugar del máximo de 8 bits, 255.

El estándar C no especifica cómo se representan los valores de punto flotante. Cada implementación / plataforma es libre de implementar números de punto flotante, sin embargo ellos lo consideran conveniente. Hay ciertas restricciones que las implementaciones deben cumplir, pero la representación a nivel de bits está definida por la implementación.

Como no puede predecir cómo se almacenará o representará un número de punto flotante en general, no hay una manera real de responder a esta pregunta como está escrita. Si tiene en mente una implementación particular de punto flotante, es posible que podamos proporcionar algunos detalles. Sin embargo, esos detalles solo serían relevantes para esa implementación específica. También tenga en cuenta que diferentes architectures de CPU pueden convertir valores de manera diferente, incluso si usan la misma representación de punto flotante.

Las representaciones de float e int en una plataforma específica están estrictamente definidas y son conocidas por el comstackdor de C en esa plataforma. Lo que significa que siempre hay un algoritmo bien definido para convertir uno a otro. En la práctica, cuando se utilizan los tipos específicos de la plataforma natural, la CPU (FPU) realiza la conversión internamente. La CPU tiene un comando dedicado que lee los datos float de la memoria en los registros internos de la CPU. Otro comando puede escribir esos datos en la memoria como un valor int . Y viceversa.

Por ejemplo, en la plataforma x86 un valor float_value = int_value generalmente se traducirá en una secuencia de comandos de CPU como

 fld int_value ; read `int` value from `int_value` to the internal register fst float_value ; save `float` value from the internal register to `float_value` 

Cuando se trata de convertir tipos de datos aritméticos que el hardware no admite de forma inmediata, el comstackdor de C debe deletrear todos los pasos de conversión necesarios literalmente en el código generado. A veces, es posible que se necesite soporte para tipos de punto flotante o enteros que ni siquiera son compatibles con el idioma, en cuyo caso se debe implementar la conversión manualmente.

En el caso general, es peligroso pensar que los valores de punto flotante son “exactos”. Una vez que tengas una fracción, un flotador probablemente será aproximado. (Si la fracción se puede express exactamente en binario, podría ser exacta, como 1/2 . Pero, por ejemplo, 1/10 será un valor aproximado).

Varias personas te han indicado artículos de Wikipedia. Lee esos. Básicamente, un valor flotante es un bit de signo, un exponente y una mantisa. Si tiene un valor flotante de 50.0 , el valor flotante no se parecerá en nada a la representación entera de 50 . (Se eliminó la discusión original incorrecta; vea los comentarios para obtener más detalles.)

No hay una forma sencilla de transformar un número entero en un flotante o viceversa. La CPU de su computadora tiene instrucciones integradas para hacer la transformación por usted, o puede escribir un progtwig que lo haga, pero no hay un truco simple.

EDITAR: Arriba fue editado para eliminar una parte donde escribí algunas cosas incorrectas. @Eric Postpischil señaló el gran error que cometí: un valor de 50 se almacenaría como un valor fraccionario elevado a una potencia mayor que uno, no como dije originalmente. Ese fue un error tonto, y me disculpo. También señaló que la parte de la “mantisa” es técnicamente el “significado”; Simplemente diré que a menudo lo he visto llamada “mantisa”, sea eso correcto o no.

Repetiré la parte importante: no hay una forma sencilla de transformar un número entero en un flotador o viceversa.