2010-11-14 3 views
-3

J'ai testé le code suivantexpériences en C++

#include <iostream> 
#include <cmath> 
#include <cfloat> 
#include <typeinfo> 
using namespace std; 
int main(){ 
int n=2; 
float f=23.01; 
int *ptr=(int *) (&f); 
*ptr<<=n; 
cout<<*ptr<<endl; 



    return 0; 
} 

parce que je sais que les opérations au niveau du bit sur les nombres flottants types ne sont pas autorisés dans C++ j'ai essayé de les convertir nombre en type entier, puis exécuter droite décalage et le résultat que j'ai obtenu est

115364332 

est-il correct? merci

+13

Que voulez-vous dire "est-ce correct?"? Qu'essayez-vous de faire? –

+1

Avez-vous essayé de lire wikipedia? http://en.wikipedia.org/wiki/IEEE_754 – ruslik

+1

"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

Répondre

3

Il n'y a pas de "correct" dans cet exemple. En lançant un pointeur vers float vers un pointeur vers int, puis en essayant d'utiliser le résultat, vous avez appelé un comportement indéfini. Si vous voulez faire un "bit-shift" sur un nombre à virgule flottante, vous pouvez simplement le multiplier par deux pour chaque bit. Il n'y a pas besoin de recourir à ce genre de piratage.

2

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.

Questions connexes