Mostrar la variable de coma flotante como un entero hexadecimal arruina el entero vecino

tengo este sencillo programa

#include <stdio.h>
int main(void)
{
 unsigned int a = 0x120;
 float b = 1.2;
 printf("%X %X\n", b, a);
 return 0;
}

Esperaba que la salida fuera

some-value 120  (some-value will depend on the bit pattern of `float b` )

Pero yo veo

40000000 3FF33333

¿Por qué el valor de a estar jodido? %X trata sus argumentos como signed int y, por lo tanto, debería haber recuperado 4 bytes de la pila e impreso el valor de b y luego obtener los siguientes 4 bytes imprime el valor de a cual es 0x120

preguntado el 03 de mayo de 12 a las 19:05

no le mientas printf() y similares. Alguna vez. Si le prometes dar un int, dale un int o con una short o con una char. Si prometes darle un long, dale un long. Lo mismo ocurre con long long. Si prometes darle un valor de punto flotante, dale un float o con una double. Si le promete un valor de punto flotante largo, dele un long double. -

2 Respuestas

En primer lugar, es un comportamiento indefinido para pasar argumentos a printf no coincide con los especificadores de formato.

En segundo lugar, el float es ascendido a double cuando se pasa a printf, por lo que son ocho bytes en lugar de cuatro. ¿Qué bytes se interpretan como los dos unsigned valores esperados por el printf El formato depende del orden en que se insertan los argumentos.

contestado el 03 de mayo de 12 a las 19:05

¿Por qué la promoción automática se duplica cuando la he definido claramente como float? - Pavan Manjunath

@Stacker Así es como funcionan los varargs. Tipos de punto flotante más pequeños que double ser ascendido a double. Tipos enteros menores que int ser ascendido a int. - Mística

@Stacker: así es como funcionan los flotadores en C. float vs double es sólo una declaración de almacenamiento. Los valores de coma flotante "siempre" se manejan como dobles en los cálculos. - Wallyk

@wallyk: los flotadores no siempre se manejan como dobles en los cálculos. Sin embargo, ellos se encuentran las siempre promovidos a dobles cuando se pasan como argumentos a una función varargs (este es uno de los promociones de argumentos predeterminados) - Esteban Canon

@Stacker: sí, es un comportamiento indefinido; lo que realmente suceda dependerá de las convenciones de paso de parámetros de la plataforma de destino, y usted ver diferentes comportamientos en diferentes plataformas. - Esteban Canon

Si desea ver los bits de un flotador almacenado, use una unión:

 float b = 1.2;
 union {
      float  f;
      int    i;
 } u;
 u.f = b;

 printf ("%x\n", u.i);

resultados (x32 de 86 bits):

3f99999a

contestado el 03 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.