2010-01-20 24 views
6

El uso de scanf, cada número escrito en, me gustaría que mi programa para de impresión a cabo dos líneas: por ejemploconvertir int a flote a hexadecimal

byte order: little-endian 

> 2 
    2 0x00000002 
    2.00 0x40000000 

> -2 
    -2 0xFFFFFFFE 
-2.00 0xC0000000 

puedo conseguirlo para imprimir el 2 en hexadecimal pero también necesito un flotador y por supuesto i cant scanf como uno cuando necesito para escanear también como un int

si yo echo como un flotador cuando intento printf me sale un cero. Si escaneo como float obtengo la salida correcta. Intenté convertir el int en un flotador , pero todavía aparece como cero.

aquí está mi salida hasta el momento

Int - float - hex 

byte order: little-endian 

>2 

     2 0x000002 
     2.00 00000000 

parece que me estoy convirtiendo en un flotador bien razón por la costumbre que se imprimen como un hexágono? si escaneo como flotante obtengo la representación hexadecimal correcta como en el primer ejemplo. esto debería ser algo simple. i necesito para escanear en forma decimal tenga en cuenta estoy funcionando esto en cygwin

aquí es lo que tengo hasta ahora ..

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 


int HexNumber; 
    float convert; 
printf("Int - float - hex\n"); 



int a = 0x12345678; 
unsigned char *c = (unsigned char*)(&a); 
if (*c == 0x78) 
{ 
    printf("\nbyte order: little-endian\n"); 
} 
else 
{ 
    printf("\nbyte order: big-endian\n"); 
} 

printf("\n>"); 
scanf("%d", &HexNumber); 
printf("\n%10d ",HexNumber); 
printf("%#08x",HexNumber); 





convert = (float)HexNumber; // converts but prints a zero 

printf("\n%10.2f ", convert); 
printf("%#08x", convert); // prints zeros 


return 0; 
} 
+0

¿Puede mostrarnos algún código? –

+0

lo siento. publicado – Steller

+0

No imprime cero cuando ingreso 1 como entrada. ¿Qué estás intentando lograr? ¿Cuál es tu número de entrada? –

Respuesta

8

intente esto:

int i = 2; 
float f = (float)i; 
printf("%#08X", *((int*) &f)); 

[EDIT]

@Corey:

vamos a analizarlo desde adentro hacia afuera:

& f = address of f = say address 0x5ca1ab1e 
(int*) &f = interpret the address 0x5ca1ab1e as integer pointer 
* ((int*)&f) = get the integer at address 0x5ca1ab1e 

el siguiente es más conciso, pero es difícil recordar asociatividad de operadores del lenguaje C y precedencia de los operadores (prefiero la claridad adicional de algunos paréntesis añadido y espacios en blanco proporciona):

printf("%#08X", *(int*)&f); 
+0

parece que edité mi respuesta para incluir lo mismo al mismo tiempo. – Trent

+0

que funciona gracias – Steller

+0

no se olvide de hacer clic en el cheque, gracias ;-) –

4
printf("%#08x", convert); // prints zeros 

Esta línea no va a funcionar porque está diciendo printf que está pasando en un int (usando el %x) pero de hecho lo está pasando en un float.

¿Cuál es su intención con esta línea? Para mostrar la representación binaria del número de coma flotante en hexágono? Si es así, es posible que desee probar algo como esto:

printf("%lx\n", *(unsigned long *)(&convert)); 

Lo que esta línea está haciendo es tomar la dirección de convert (&convert) que es un puntero a un flotador y echándola en un puntero a un largo sin signo (nota: que el tipo que insertas aquí puede ser diferente dependiendo del tamaño del flotador y largo en tu sistema).La última * se dereferencing el puntero a un entero largo sin signo en un largo sin signo que se pasa a printf

+0

Gracias por su explicación de lo que hizo. Muy útil – Steller

+0

Tengo curiosidad de cómo puedo obtener un formato como este: 0xFFFFFFFE en lugar de 0xffffffe. - si uso mayúscula X es como 0XFFFFFFFE necesito la x pequeña y el resto grande ... – Steller

+1

@Corey use "0x% 08X" en lugar de "% # 08X" – Trent

1

Dado un int x, convirtiendo a flotador, a continuación, imprimir los bytes de que flotan en hexadecimal se podría hacer algo como esto:

show_as_float(int x) { 
    float xx = x; 

    //Edit: note that this really prints the value as a double. 
    printf("%f\t", xx); 

    unsigned char *ptr = (unsigned char *)&xx; 

    for (i=0; i<sizeof(float); i++) 
     printf("%2.2x", ptr[i]); 
} 

las normas (C++ y C99) da "permiso especial" para unsigned char, por lo que es seguro utilizarlos para ver el bytes de cualquier objeto. C89/90 no lo garantizaba, pero, sin embargo, era razonablemente portátil.