Mostrar la variable de coma flotante como un entero hexadecimal arruina el entero vecino
Frecuentes
Visto 461 veces
0
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
2 Respuestas
8
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 sí ver diferentes comportamientos en diferentes plataformas. - Esteban Canon
2
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 c floating-point hex printf format-specifiers or haz tu propia pregunta.
no le mientas
printf()
y similares. Alguna vez. Si le prometes dar unint
, dale unint
o con unashort
o con unachar
. Si prometes darle unlong
, dale unlong
. Lo mismo ocurre conlong long
. Si prometes darle un valor de punto flotante, dale unfloat
o con unadouble
. Si le promete un valor de punto flotante largo, dele unlong double
. - Alexey Frunze