convertir int flotter en hexadécimal
-
21-09-2019 - |
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;
}
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.