Question

En utilisant scanf, chaque numéro tapé, je voudrais que mon programme imprimer deux lignes: par exemple

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

Je peux l'obtenir pour imprimer le 2 dans l'hexagone mais je dois aussi un flotteur et bien sûr je ne peux pas Scanf comme un quand je dois analyser aussi comme un int

Si je jetai un flotteur lorsque je tente de printf je reçois un zéro. Si je scanne en tant flotteur i obtenir la sortie correcte. J'ai essayé de convertir l'int à un flotteur, mais il est toujours à zéro.

voici ma sortie jusqu'à présent

Int - float - hex

byte order: little-endian

>2

         2  0x000002
      2.00  00000000

on dirait que je suis en train de convertir une amende de flotteur pourquoi Wont imprimer comme un hexagone? si je scanne en tant float i obtenir la représentation hexagonale correcte comme le premier exemple. cela devrait être quelque chose de simple. Je ne dois analyser en tant décimal Garder en tete je suis en cours d'exécution dans ce Cygwin

Voici ce que j'ai à ce jour ..

#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;
}
Était-ce utile?

La solution

essayez ceci:

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

[EDIT]

@Corey:

nous allons l'analyser de l'intérieur:

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

ce qui suit est plus concis, mais il est difficile de se rappeler l'opérateur de langage C et l'associativité priorité des opérateurs (je préfère la clarté supplémentaire de quelques parenthèses ajoutée et des espaces fournit):

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

Autres conseils

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

Cette ligne ne va pas travailler parce que vous dites printf que vous passez dans un int (en utilisant le %x) mais enfait vous passez dans un float.

Quelle est votre intention avec cette ligne? Pour montrer la représentation binaire du nombre à virgule flottante dans l'hexagone? Si oui, vous voudrez peut-être essayer quelque chose comme ceci:

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

Qu'est-ce que cette ligne est en train de faire est de prendre l'adresse de convertir (&convert) qui est un pointeur sur un flotteur et le jetant dans un pointeur sur une longue (note non signée: que le type que vous lancez dans ici peut être différent en fonction de la la taille du flotteur et à long sur votre système). Le dernier * est déréférencement le pointeur sur un unsigned long dans un unsigned long qui est passé à printf

Soit un int x, la conversion à flotter, puis imprimer les octets de qui flottent dans l'hexagone pourrait faire quelque chose comme ceci:

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]);
}

Les normes (C ++ et C99) donnent « une dispense spéciale » pour unsigned char, il est donc sûr de les utiliser pour afficher les octets de tout objet. C89 / 90 ne garantit pas, mais il était raisonnable néanmoins portable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top