Newsgroup: it.comp.lang.c
Titolo: printf di float in esadecimale

Sto' affogando in bicchiere d'acqua !
Qualcuno è così gentile da dirmi quale specificatore devo
usare con la printf per stampare in esadecimale il
valore di una variabile float ?
Per esempio 
float a = 0.65;
printf(" %NONLOSO \n", a);
mi "dovrebbe" stammpare 6666263F o viceversa 3F266666
(IEEE 32 bit)
Grazie anticipate

 (IEEE 32 bit)
Cio` che (forse) cerchi e` "%a" oppure "%A". Vale solo per il C99, 
quindi il tuo compilatore potrebbe non supportarlo. Tieni pero` presente 
che il float sara` convertito in double durante la chiamata a printf, 
per le usuali conversioni implicite di tipo (derivanti dal fatto che 
printf accetta un numero variabile di argomenti).
Inoltre l'output non e` propriamente nel formato da te specificato:
     #include <stdio.h>
     int main(void)
     {
         printf("%A\n", 0.65);
         return 0;
     }
     [/tmp]$ gcc -Wall -std=c99 -pedantic -o junk junk.c
     [/tmp]$ ./junk
     0X1.4CCCCCCCCCCCDP-1
Se non ti va bene, l'unica alternativa e` scrivere una funzioncina che 
si occupi della stampa (facendo uso della possibilita` di esaminare un 
oggetto byte per byte tramite un unsigned char *):
     #include <stdio.h>
     void print_hex_float(float f)
     {
         unsigned char *p = (unsigned char *) &f;
         int i;
         for (i = 0; i < sizeof f; i++)
             printf("%.2X", *p++);
     }
     int main(void)
     {
         float f = 0.65;
         print_hex_float(f);
         putchar('\n');
         return 0;
     }
     [/tmp]$ gcc -Wall -ansi -pedantic -o junk junk.c
     [/tmp]$ ./junk
     6666263F
PS: E` da notare che lo standard C non richiede ne` che i float siano di 
32 bit, ne` che l'implementazione sia conforme a IEEE 754. Quindi su 
altre macchine il risultato potrebbe essere differente.
-- 
Enrico `Trippo' Porreca

Grazie mille per la velocita' e precisione nel rispondermi.

 Grazie mille per la velocita' e precisione nel rispondermi.
Ehm, aspetta a ringraziare :-)
Il codice che ho postato contiene un errore: infatti la specifica "%X" 
richiede un unsigned int, mentre l'unsigned char che gli passo viene 
convertito automaticamente in signed int (se questo ha un range 
sufficiente per contenere il valore). E` quindi necessario convertirlo 
esplicitamente.
Questo e` il codice corretto:
     void print_hex_float(float f)
     {
         unsigned char *p = (unsigned char *) &f;
         int i;
         for (i = 0; i < sizeof f; i++)
             printf("%.2X", (unsigned) *p++);
     }
-- 
Enrico `Trippo' Porreca

This message was cancelled from within Mozilla.

 Grazie mille per la velocita' e precisione nel rispondermi.
Ehm, aspetta a ringraziare :-)
Il codice che ho postato contiene un errore: infatti la specifica "%X" 
richiede un unsigned int, mentre l'unsigned char che gli passo viene 
convertito automaticamente in signed int (se questo ha un range 
sufficiente per contenere il valore). E` quindi necessario convertirlo 
esplicitamente.
Inoltre, tanto che ci siamo, trasformiamo l'indice i in un tipo 
opportuno senza segno (size_t, che e` lo stesso tipo prodotto da 
sizeof), in modo da evitare ogni possibile problema di confronto tra 
valori misti signed/unsigned.
Questo e` il codice corretto:
     void print_hex_float(float f)
     {
         unsigned char *p = (unsigned char *) &f;
         size_t i;
         for (i = 0; i < sizeof f; i++)


 altre macchine il risultato potrebbe essere differente.
Se l'implementazione definisce il simbolo __STD_IEC_559__ (che equivale
allo std ANSI/IEEE 754) allora il formato binario dei numeri in virgola
mobile e` quello definito dallo standard (come da allegato F).
Luca
-- 
Home: 
http://kronoz.cjb.net
This message will self distruct in 5 seconds.