Vous traitez les octets de votre représentation float
comme int
octets dans ce cas, et vous violez de strict aliasing rules C++ avec votre utilisation de pointeurs.
Mais si vous voulez savoir que si vous avez traité les octets sous votre float
comme int
, puis effectué une décalage vers la gauche de 2 bits sur les octets ...
L'exemple de code suivant est en C (mais fonctionnera en C++), et je copie les octets du float
(en supposant IEEE-754 representation) à un unsigned int
, et exécutez le bitshift là-dessus.
modifier Mise à jour extrait de code pour montrer la suite de ce qui se passe quand vous faites cela int
puis essayez opérateurs de bits d'utiliser ces octets comme float
octets à nouveau.
modifier pour les curieux: Compilé et exécuter sur Visual Studio 2008 dans Windows 7 et avec GCC 4.4 dans Debian Linux, sur un système Intel
#include <stdio.h>
#include <string.h>
int main()
{
float f = 23.01;
unsigned int ui;
memcpy(&ui, &f, sizeof(ui));
printf("hex is %x\n", ui);
ui <<= 2;
printf("%d is the new value of ui\n", ui);
printf("hex of ui now is %x\n", ui);
float newf;
memcpy(&newf, &ui, sizeof(newf));
printf("%f is newf\n", newf);
/* yes this is violating the strict aliasing rules, but just for show */
printf("%d is newf's int representation\n", *((unsigned int*)&newf));
return 0;
}
/** Output
[email protected]:~$ gcc hexout.c
[email protected]:~$ ./a.out
hex is 41b8147b
115364332 is the new value of ui
hex of ui now is 6e051ec
0.000000 is newf
115364332 is newf's int representation
**/
Comme DeadMG a dit ... n » t fais ça.
Que voulez-vous dire "est-ce correct?"? Qu'essayez-vous de faire? –
Avez-vous essayé de lire wikipedia? http://en.wikipedia.org/wiki/IEEE_754 – ruslik
"Est-ce correct?" n'est pas une vraie question car il n'y a aucune indication sur ce que la question attend de la sortie "correcte". – meagar