IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

problème de cast


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 134
    Par défaut problème de cast
    Bonjour,
    J'aimerais caster un nombre entier en nombre flottant.
    Je veux un cast qui conserve la signature du nombre, autrement dit que les 4 octets du nombre ne bougent pas.

    Quand je fais un reinterpret_cast<float>( 0xFFFFFFFF), mon compilateur (gcc) me sort une erreur: invalid cast from type «unsigned int" to type «float"
    Est-ce que quelqu'un a une piste?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Il faut passer par un cast de pointeurs:

    En supposant que les deux types aient la même taille:
    monUInt = *reinterpret_cast< unsigned int * >(&monFloat)
    Et dans l'autre sens: monFloat = *reinterpret_cast< float * >(&monUInt)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 134
    Par défaut
    Effectivement, ça marche, merci.
    Mais je m'étonne que le reinterpret_cast ne sache pas convertir un int en float directement.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut Hypnocrate,

    Si tu dois faire des aller-retours entre float et unsigned int, tu peux aussi utiliser une union:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    union BitPuree
    {
      unsigned int asInt;
      float asFloat;
    };
     
    BitPuree myPuree;
    myPuree.asInt = 0xffffffff;
    float someOtherFloat = myPuree.asFloat;
    //...
    myPuree.asFloat = someProcessedFloat;
    unsigned int result = myPuree.asInt;
    Carl

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par 5hdumatin Voir le message
    Si tu dois faire des aller-retours entre float et unsigned int, tu peux aussi utiliser une union:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    union BitPuree
    {
      unsigned int asInt;
      float asFloat;
    };
     
    BitPuree myPuree;
    myPuree.asInt = 0xffffffff;
    float someOtherFloat = myPuree.asFloat;
    //...
    myPuree.asFloat = someProcessedFloat;
    unsigned int result = myPuree.asInt;
    Comportement indéfini, la manière correcte est d'utiliser memcpy.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par Hypnocrate Voir le message
    Mais je m'étonne que le reinterpret_cast ne sache pas convertir un int en float directement.
    Pourquoi? Tu ne peux pas non plus écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int ci = 3;
    int i = const_cast<int> (ci);
    ni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Base { virtual ~Base(); };
    class Derived : public Base {};
     
    Base b;
    Derived d = static_cast<Derived> (b);
    ni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Derived d = dynamic_cast<Derived> (b);

Discussions similaires

  1. [CASTS]problème de cast de Time
    Par DeVoN dans le forum Langage
    Réponses: 7
    Dernier message: 22/02/2006, 17h24
  2. [JDBC Driver][JSTL] Problème de cast de données
    Par GyLes dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 27/09/2005, 10h00
  3. problème de cast!
    Par LaseLiep dans le forum Langage
    Réponses: 3
    Dernier message: 03/06/2005, 09h30
  4. Problème de cast/serialization/externalization ?
    Par Linlin dans le forum CORBA
    Réponses: 1
    Dernier message: 06/12/2004, 16h46
  5. [C#] Problème de casting de @IDENTITY
    Par bilb0t dans le forum Accès aux données
    Réponses: 7
    Dernier message: 03/09/2004, 09h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo