Domanda

Utilizzando scanf, ogni numero digitato, vorrei il mio programma per stampare due linee: per esempio

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

posso farlo per stampare il 2 in esadecimale ma anche bisogno di un galleggiante e naturalmente i cant scanf come uno quando ho bisogno di eseguire la scansione anche come un int

Se lancio come un galleggiante quando provo a printf ottengo uno zero. Se la scansione come un galleggiante ottengo l'output corretto. Ho cercato di convertire l'int a un galleggiante ma viene ancora fuori come zero.

Questa è la mia uscita finora

Int - float - hex

byte order: little-endian

>2

         2  0x000002
      2.00  00000000

Sembra che io sono la conversione a una multa galleggiante perché abituato esso stampa come un esagono? se la scansione come un galleggiante ottengo rappresentazione esadecimale corretto come nel primo esempio. questo dovrebbe essere qualcosa di semplice. ho bisogno di eseguire la scansione in come decimale tieni a mente sto facendo funzionare questo Cygwin

Ecco quello che ho finora ..

#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;
}
È stato utile?

Soluzione

provare questo:

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

[EDIT]

@Corey:

cerchiamo di analizzarlo dall'interno verso l'esterno:

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

il seguente è più conciso, ma è difficile ricordare associatività operatore del linguaggio C e precedenza degli operatori (io preferisco la chiarezza in più di qualche parentesi aggiunto e spazi fornisce):

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

Altri suggerimenti

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

Questa linea non è andare a lavorare perché si sta dicendo printf che si passa in un int (utilizzando il %x), ma infatti si passa in un float.

Qual è la vostra intenzione con questa linea? Per mostrare la rappresentazione binaria del numero decimale in esadecimale? Se è così, si potrebbe voler provare qualcosa di simile:

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

Che questa linea sta facendo sta prendendo l'indirizzo del convertito (&convert), che è un puntatore ad un galleggiante e la colata in un puntatore ad un unsigned long (nota: che il tipo di lanci in questa sede può essere diversa a seconda del dimensione del flottante e lunga sul vostro sistema). L'ultima * è dereferenziazione il puntatore ad un unsigned long in un unsigned long che è passato a printf

Dato un int x, la conversione a stare a galla, quindi stampare i byte di che galleggiano in esadecimale si potrebbe fare qualcosa di simile:

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

Gli standard (C ++ e C99) danno "dispensazione speciale" per unsigned char, quindi è sicuro utilizzarli per visualizzare i byte di qualsiasi oggetto. C89 / 90 non ha garantito che, ma era ragionevolmente portatile comunque.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top