Représentations hexadécimales de nombres 32 bits

J’ai un script qui génère deux nombres aléatoires à virgule flottante 32 bits a et b et les divise pour créer une sortie c.

J’aimerais stocker ces 3 nombres en virgule flottante au format hexadécimal, sous la forme d’une chaîne de 8 caractères.

J’ai trouvé un moyen intelligent de le faire en ligne ici:

http://forums.devshed.com/c-programming-42/printing-a-float-as-a-hex-number-567826.html

Et voici ma mise en œuvre de leurs conseils en C ++

fileout << hex << *(int*)&a[i] << endl; fileout << hex << *(int*)&b[i] << endl; fileout << hex << *(int*)&c[i] << endl; 

Cela fonctionne pour la plupart des cas. Cependant, dans certains cas, les chaînes ne sont pas larges de 8 caractères. Parfois, ils ne sont qu’un peu longs. Voici l’exemple de la sortie:

  af1fe786 ffbbff0b fffbff0b 7fbcbf00 <-I like it, but has zeros at the end 77fefe77 7ffcbf00 fdad974d f2fc7fef 4a2fff56 67de7744 fdf7711b a9662905 cd7adf0 <-- problem 5f79ffc0 0 <--- problem 6ebbc784 cffffb83 de3bcacf e7b3de77 ec7f660b 3ab44ae4 aefdef82 fffa9fd6 fd1ff7d2 62f4 <--why not "62f40000" ebbf0fa6 ddd78b8d 4d62ebb3 ff5bbceb 3dfc3f61 ff800000 <- zeros at end, but still 8 bytes? df35b371 e0ff7bf1 3db6115d fbbfbccc ddf69e06 5d470843 a3bdae71 fe3fff66 0 <--problem 979e5ba1 febbe3b9 0 <-problem fdf73a80 efcf77a7 4d9887fd cafdfb07 bf7f3f35 4afebadd bffdee35 efb79f7f fb1028c <--problem 

Je veux des représentations à 8 caractères. En ce qui concerne le cas de zéro, je veux le convertir en “00000000”.

Mais je suis vraiment confus à propos de ceux qui ne comptent que 4, 5, 6, 7 caractères. Pourquoi certains nombres sont-ils remplis de zéros à la fin et d’autres sont-ils tronqués? Si un int est de 32 bits, pourquoi parfois un seul bit seulement apparaît-il? Est-ce dû à des nombres “subnormaux” infâme?

Merci.

Si je comprends bien votre exigence, vous souhaitez append des zéros en tant que caractère de remplissage à gauche de vos représentations hexadécimales si le nombre de chiffres est inférieur à 8.

Dans ce cas, vous pouvez simplement utiliser les manipulateurs de stream std::setfill() std::setw() :

 #include  // Necessary for the setw and setfill int n = ...; std::cout << std::hex << std::setw(8) << std::setfill('0') << n; 

Pour n = 1024 , par exemple, le résultat sera:

 00000400 

Utilisez std::setw() et std::setfill() :

 fileout << hex << setw(8) << setfill('0') << *(int*)&a[i] << endl; fileout << hex << setw(8) << setfill('0') << *(int*)&b[i] << endl; fileout << hex << setw(8) << setfill('0') << *(int*)&c[i] << endl; 

oubliez l’intelligence (c’est tout sauf). Découvrez setw et setfill .