obtenir la valeur de représentation entière d’une variable de type float en C

J’ai le numéro 20 (0x14) stocké dans un registre 32 bits. Le registre est alloué à une variable C float représentant la valeur 2.8e-44. Maintenant, je veux récupérer la représentation hexadécimale de la variable float et la stocker dans une variable entière afin de restaurer le sens initial de l’information. Y a-t-il une meilleure façon de faire cela, en dehors de certaines affaires de pointeur? Voici le code:

#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; } 

Je reçois ce que je veux en utilisant le pointeur pnv entier. Y a-t-il une meilleure façon de le faire en évitant les pointeurs et en travaillant en C?

Vous pouvez réaliser votre besoin avec un syndicat:

 #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; } 

Notez que le comportement de (int*)&f n’est pas défini car les types de pointeur ne sont pas liés. Donc, n’abordez pas le problème de cette façon.

Après avoir vérifié que sizeof(float) est identique à sizeof(int) , vous pouvez le faire de deux manières:

1) Type élagage à travers une union composée d’un float , et un int . Définissez l’ union utilisant un membre et relisez-la avec l’autre.

2) memcpy le contenu d’une variable d’un type à l’emplacement de la variable de l’autre type.

Parmi ceux-ci, je préfère (2): (1) pourrait ne pas être défini avec les anciens standards C, et (2) fonctionne également bien avec C ++.

Vous pouvez directement le convertir en entier sous la forme;

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

Ou vous pouvez utiliser certaines fonctions intégrées telles que rond, plafond, sol, etc.

Pour référence: http://www.cplusplus.com/reference/cmath/round/?kw=round

vous pouvez utiliser le casting de caractères ..

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

Que faites-vous là est un comportement indéfini , n’avez-vous pas vérifié l’avertissement?

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

Lisez ceci s’il vous plaît: Comment les chiffres 1101004800 correspondent-ils au nombre 20?

C est considéré comme une langue de type faiblement typé, ce qui peut permettre d’affecter des valeurs appartenant à des types différents de ceux de la variable qui leur est affectée. Vous pouvez donc le faire simplement:

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

Ceci est connu sous le nom de conversion de type implicite, également appelée coercition, est une conversion de type automatique par le compilateur. Certains langages de programmation permettent aux compilateurs d’exercer une contrainte; d’autres en ont besoin.

mais considérez ce qui suit:

  • que se passe-t-il lorsque le flottant est inférieur à zéro?