3 votes

Impression de l'hexagone interne d'un flottant

J'ai donc pensé que je pouvais imprimer l'hexagone interne d'un float comme ceci :

const auto foo = 13.0F;
const auto bar = reinterpret_cast<const unsigned char*>(&foo);

printf("0x%02hhX%02hhX%02hhX%02hhX\n", bar[0], bar[1], bar[2], bar[3]);

Cette sortie :

0x00005041

Mais lorsque je regarde le débogueur, l'hexagone qu'il signale est le suivant foo est :

0x003EF830

Quelqu'un peut-il m'aider à comprendre pourquoi cela n'a pas fonctionné et ce que je dois faire pour que cela fonctionne ?

5voto

Mike Vine Points 5570

La valeur hexadécimale de la valeur à virgule flottante 13.0f est :

0x41500000

Confirmation :

Prendre 0x41500000 qui est en binaire :

0100,0001,0101,0000,0000,0000,0000,0000

qui se décompose en un signe de 1 bit, un exposant de 8 bits et une mantisse de 23 bits :

0 : 10000010 : 10100000000000000000000

Et nous pouvons interpréter ceci en utilisant l'évaluation flottante standard de :

-1^s x 1.<mantissa> x 2^(exponent-127)

comme

(-1)^0 x 1.101 x 2^(10000010-1111111)

qui est

1.101b x (10b)^11b

qui est

1.625 x 8

qui est

13.0f

Ce qui signifie que votre sortie est correcte (en supposant un format little endian)

La façon dont vous la lisez dans le débogueur est incorrecte.

5voto

BJovke Points 1101

Vous avez presque compris. Je ne suis pas sûr de ce que le débogueur affiche, mais ce n'est pas votre flotteur. Peut-être s'agit-il de son adresse ?

La valeur flottante réelle est 0x41500000 . Vous pouvez le consulter ici : Convertisseur à virgule flottante IEEE-754 . Si le lien ne fonctionne pas, vous devrez trouver l'analyseur/description de la virgule flottante en ligne par vous-même.

Vous avez procédé de la bonne manière, mais vous avez oublié que les CPU Intel x86 (je suppose que votre CPU est Intel x86) sont petit endian . Cela signifie que les octets de plus grande importance se trouvent à des adresses mémoire plus élevées. Vous devez donc imprimer les octets dans l'ordre inverse de celui dans lequel vous les imprimez, comme ceci :

printf("0x%02hhX%02hhX%02hhX%02hhX\n", bar[3], bar[2], bar[1], bar[0]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X