2013-08-16 14 views
6

Voglio convertire un numero float per esempio 2.45 per il char array di 4 byte. quindi il 2.45 dovrebbe apparire come questo '@' 'FS' 'Ì' 'Í' che è binario la rappresentazione ieee di 2.45 = 01000000 00011100 11001100 11001101?Come convertire un float in un char di 4 byte in C?

Ho risolto il problema ma ha una cattiva complessità. hai qualche buona idea?

Grazie per le buone risposte.

puoi dirmi, per favore, la via del ritorno dall'array al numero float?

+2

Come dire 'char a [sizeof the_float]; memcpy (char_array, & the_float, sizeof the_float) '? –

+2

''Ì'' e'' Í'' sono solo la rappresentazione di '11001100 11001101' in un set di caratteri. – glglgl

risposta

7

Hai alcuni modi di fare questo, tra questi due:

  1. Usa fusione di caratteri e puntatori:

    float f = 2.45; 
    char *s = (char *) &f; 
    

    Si noti che questo non è sicuro in qualsiasi modo e che non ci sono terminatori di stringa dopo la "stringa".

  2. Utilizzare un union:

    union u 
    { 
        float f; 
        char s[sizeof float]; 
    }; 
    
    union u foo; 
    foo.f = 2.45; 
    

    L'array di caratteri può ora accedere per ottenere i valori di byte. Nota anche come la prima alternativa non c'è un terminatore di stringhe.

+0

"questo in realtà sfrutta un comportamento indefinito" - potresti spiegarlo ulteriormente? – Jimbo

+2

'memcpy()' è preferito su entrambi i tuoi approcci. (A proposito, il primo metodo è "sicuro" se il puntatore aliasing è (firmato o non firmato) 'char *'. E il secondo metodo non richiama nemmeno UB. –

+0

@Jimbo Ricorda che tutti i membri di un ' union' condivide la stessa memoria.Questo significa che puoi solo ottenere in modo affidabile il valore dell'ultimo membro impostato.Se imposto il membro 'f' nel mio esempio, dovrei solo ottenere' f' dopo aver impostato un altro membro. Fare diversamente non è davvero indefinito ma può causare valori inaspettati –

13

Basta usare memcpy:

#include <string.h> 

float f = 2.45f; 
char a[sizeof(float)]; 

memcpy(a, &f, sizeof(float)); 

Se si richiede l'endianness contrario, allora è una cosa da poco per invertire i byte in a in seguito, ad esempio,

int i, j; 

for (i = 0, j = sizeof(float) - 1; i < j; ++i, --j) 
{ 
    char temp = a[i]; 
    a[i] = a[j]; 
    a[j] = temp; 
} 
+0

e come posso cambiare l'endian? – 12oni

+1

@ 12oin 'tmp = a [0]; a [0] = a [3]; a [3] = tmp; tmp = a [1]; a [1] = a [2]; a [2] = tmp; 'per cambiare l'endian. – nos

Problemi correlati