ottenere il valore di rappresentazione intero di una variabile di tipo float in C

Ho il numero 20 (0x14) memorizzato in un registro a 32 bit. Il registro è allocato a una variabile C float che rappresenta il valore 2.8e-44. Ora voglio recuperare la rappresentazione esadecimale della variabile float e memorizzarla in una variabile intera per ripristinare il significato originale delle informazioni. C’è un modo migliore per farlo, oltre a fare affari con i puntatori? Ecco il codice:

#include  int main() { float f = 2.802597e-44; int nv,*pnv; printf("f=%f\n",f); printf("n=%d\n",f); nv=(int)f; printf("n=%d\n",nv); pnv=(int*)&f; printf("n=%d\n",(*pnv)); return 0; } 

Ottengo quello che voglio usando il puntatore intero pnv. C’è un modo migliore per farlo evitando i puntatori e lavorando in C?

Puoi raggiungere il tuo bisogno con un sindacato:

 #include  int main() { union { int i; float f; } fi; fi.f = 2.802597e-44; printf("f=%e\n",fi.f); printf("n=%d\n",fi.i); return 0; } 

Si noti che il comportamento di (int*)&f non è definito poiché i tipi di puntatori non sono correlati. Quindi non affrontare il problema in questo modo.

Dopo aver verificato che sizeof(float) è uguale a sizeof(int) , puoi farlo in due modi:

1) Digitare potatura attraverso union composta da un float e un int . Imposta l’ union usando un membro e rileggilo con l’altro.

2) memcpy il contenuto di una variabile di un tipo alla posizione della variabile dell’altro tipo.

Di questi preferisco (2): (1) potrebbe non essere definito con gli standard C più vecchi, e (2) funziona anche bene con C ++.

Puoi lanciarlo direttamente su intero come;

 float a = 7.4; int b = a; // this will be rounded to 7 and you will lose information 

Oppure puoi usare alcune funzioni built-int come round, ceil, floor, ecc.

Per riferimento: http://www.cplusplus.com/reference/cmath/round/?kw=round

puoi usare type casting ..

 float x =3.4; int y = (int)x; 

Che cosa stai facendo c’è un comportamento indefinito , non hai controllato l’avviso?

 warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat=] printf("n=%d\n",f); ^ 

Leggilo per favore: in che modo le cifre 1101004800 corrispondono al numero 20?

C è considerato un linguaggio indebolito, che può consentire di assegnare valori che appartengono a tipi diversi dalla variabile a cui sono assegnati, quindi puoi semplicemente fare questo:

  int integer = 1; float floater =1.1111; floater = integer; 

Questo è noto come conversione di tipo implicito, noto anche come coercizione, è una conversione di tipo automatico da parte del compilatore. Alcuni linguaggi di programmazione consentono ai compilatori di fornire la coercizione; altri lo richiedono

ma considera quanto segue:

  • cosa succede quando il float è inferiore a zero?