2010-01-20 11 views
6

En utilisant scanf, chaque numéro tapé, je voudrais que mon programme impression sur deux lignes: par exempleconvertir int flotter en hexadécimal

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 j'ai aussi besoin d'un flotteur et bien sûr je ne peux pas scanf comme un quand j'ai besoin de scanner aussi comme un int

Si je lance comme un flotteur lorsque j'essaie d'imprimer, je reçois un zéro. Si je scanne comme un flotteur je reçois la bonne sortie. J'ai essayé de convertir l'int en un flotteur mais il sort toujours comme zéro.

voici ma sortie jusqu'à

Int - float - hex 

byte order: little-endian 

>2 

     2 0x000002 
     2.00 00000000 

on dirait que je suis en train de convertir à un flotteur bien pourquoi coutume il imprimer comme un hexagone? Si je scanne en tant que flotteur, j'obtiens la représentation hexadécimale correcte comme le premier exemple. cela devrait être quelque chose de simple. Je ne dois numériser en tant que décimal garder à l'esprit je cours ceci dans Cygwin

voici ce que j'ai jusqu'à présent ..

#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

Pouvez-vous s'il vous plaît nous montrer du code? –

+0

désolé. its posted – Steller

+0

N'imprime pas zéro pour moi quand j'entre 1 comme entrée. Qu'essayez-vous d'accomplir? Quel est votre numéro d'entrée? –

Répondre

8

essayez ceci:

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

[EDIT]

@Corey:

analysons 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 l'associativité et la 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); 
+0

il semble que j'ai édité ma réponse pour inclure la même chose en même temps. – Trent

+0

cela fonctionne merci – Steller

+0

ne pas oublier de cliquer sur le chèque, merci ;-) –

4
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 en fait vous le passez dans un float.

Quelle est votre intention avec cette ligne? Pour afficher la représentation binaire du nombre à virgule flottante en hexadécimal? 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 vers un unsigned long (note: que le type que vous lancez ici peut être différent selon 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

+0

Merci pour votre explication de ce que vous avez fait. Très utile – Steller

+0

Je suis curieux de savoir comment je peux l'obtenir au format comme ceci: 0xFFFFFFFE au lieu de 0xffffffe. - si j'utilise majuscule X c'est comme 0XFFFFFFFE j'ai besoin du x petit et le reste grand .. – Steller

+1

@Corey utiliser "0x% 08X" au lieu de "% # 08X" – Trent

1

Etant donné un int x, la conversion en flotteur, puis imprimer les octets de qui flottent dans l'hexagone pourrait être fait 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 sûr de les utiliser pour voir la octets de n'importe quel objet. C89/90 ne le garantissait pas, mais il était néanmoins raisonnablement portable.