2011-12-09 8 views
5

Quiero encasillar un float como int. Sin embargo, esto no hace una copia poco a poco. ¿Es posible encasillar un float en un int manteniendo todos los bits (signo, exponente, mantisa)?Typecasting by bit copy

+0

Esto solo puede funcionar si 'sizeof (float) <= sizeof (int)'. No tengo ganas de buscar en Google la respuesta si esto está garantizado por el idioma. –

Respuesta

3

La mayoría de los lenguajes permiten algo por el estilo, en C es como:

float f = 3.14f; 
int i = *(int*)&f; 
+0

¡Esto es maravilloso! ¡Exactamente lo que estoy buscando! –

+0

Aunque esto puede funcionar en la mayoría de los casos, desencadena una advertencia en GCC porque viola el alias estricto, que es un comportamiento técnicamente indefinido. – Mysticial

+0

Eso es interesante, ¿no generó una advertencia en mi GCC (4.4.3)? –

4

No es posible hacer esto de una manera completamente compatible con C, pero se puede usar sindicatos:

union{ 
    int i; 
    float f; 
} u; 

u.f = 123.456; // Your value. 

// Read u.i. 

Esto debería funcionar en casi todos los sistemas de hoy en día. Y, por supuesto, se supone que float y int son del mismo tamaño.

La alternativa es usar el puntero fundido, pero estrictamente hablando, eso viola el alias estricto y se considera un comportamiento indefinido.


Otro (posiblemente sea compatible con - ver comentarios) enfoque es utilizar memcpy():

int i; 
float f; 

f = 123.456; // Your value. 

memcpy(&i, &f, sizeof(int)); 

// Read i 
+0

Creo que esto es un comportamiento no especificado (que mencionas en tu primera oración, aunque obtusamente). El Apéndice J1 de C99 dice "Los siguientes no están especificados: ... el valor de un miembro de la unión que no sea el último almacenado en". No especificado se encuentra entre el comportamiento definido por la implementación y el comportamiento indefinido: la implementación no tiene que documentar cómo se realiza una elección en cuanto a cuáles son los resultados. Aún así, no hay otra forma (segura) de hacerlo así que +1. – paxdiablo

+0

Pero hasta donde sé, gcc garantiza que el tipo de juego de palabras por medio de uniones funciona con él, por lo que si no tiene que ser portátil, está bien. –

+0

¿Qué pasa con memcpy? –