Pregunta

El uso de scanf, cada número escrito en, me gustaría que mi programa para imprimir dos líneas: por ejemplo

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

Me puede conseguir que se imprima la 2 en hexadecimal Pero también necesito un flotador y por supuesto que no puede scanf como uno cuando necesito también escaneado como un int

Si yo echo como un flotador cuando intento printf me sale un cero. Si escaneo en un flotador i obtener la salida correcta. He tratado de convertir el int a una flotar pero todavía sale 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 a una multa de flotación ¿por costumbre se imprime como un hexágono? Si escaneo en un flotador como me sale la representación hexadecimal correcta al igual que el primer ejemplo. esto debe ser algo sencillo. i necesito para escanear en forma decimal tenga en cuenta estoy funcionando esto en cygwin

Esto 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;
}
¿Fue útil?

Solución

intente lo siguiente:

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

[EDIT]

@Corey:

dejar de analizarlo desde adentro hacia fuera:

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

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

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

Otros consejos

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

Esta línea no va a funcionar porque le está diciendo printf que está de paso en una int (mediante el uso de la %x) pero infact está de paso 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 hexadecimal? 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 lances en que aquí puede ser diferente dependiendo de la tamaño del flotador y larga en su sistema). La última * se dereferencing el puntero a un entero largo sin signo en un largo sin signo que se pasa a printf

Dado un int x, convirtiendo a flotar, 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 los bytes de cualquier objeto. C89 / 90 no garantizaba que, pero era razonablemente portátil, no obstante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top