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 :

Cast float to char


Sujet :

C++

  1. #1
    Membre émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut Cast float to char
    Bonjour,


    Ma question est simple : que prévoit le standard C++ pour les casts de float en char ?

    J'ai des valeurs flottantes comprises entre 0 et 1, et je dois les écrire dans un fichier sous forme d'entier compris entre 0 et 255 (pour créer un fichier image au format ppm).

    Donc je fais un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichier << ((char)(c.r*255));
    fichier << ((char)(c.g*255));
    fichier << ((char)(c.b*255));
    Mais voilà, si j'optimise avec -O3 (de g++) et que c vaut {1.0, 1.0, 1.0} j'obtiens dans mon fichier les octets 7f ff ff.


    Au début je pensais que ça allait convertir un peu comme ça :
    255.0F -> 255L -> (char)-1
    Et que ensuite ça m'écrive l'octet ff dans le fichier, puisque de toutes façons, -1 en char ça fait ff.

    Mais en fait, je crois que le 7f vient du fait que la conversion float -> char donne la valeur max d'un char (soit 127) si le flottant est "trop grand".


    D'où ma question : que prévoit le standard C++ ?
    Si il prévoit quelque chose, c'est bizarre que j'obtienne des valeurs différentes -> bug dans g++.
    Si il ne prévoit rien, ok, pas de problème, le compilateur fait ce qu'il veut.


    NB : J'obtiens des valeurs différentes pour les trois composantes uniquement si j'optimise le code. Avec -O0 (ou rien) ça me donne bien trois fois ff. Et ça ne me donne ce bug qu'avec g++ 4.3.3. Pour les autres versions testés, je n'obtiens pas le même résultat.
    NB2 : Je sait que pour corriger le bug il suffit de caster en unsigned char, mais ce n'est pas la question.


    Edit : un code de test peut être trouvé ici : http://rafb.net/p/SOwMtJ77.html


    Merci d'avance.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par Celelibi Voir le message
    D'où ma question : que prévoit le standard C++ ?
    Comportement indéfini, le compilateur à le droit de faire ce qu'il veut. Tu as eu de la chance il aurait pu reformater ton disque dur
    Citation Envoyé par le standard C++
    4.9 Floating-integral conversions [conv.fpint]

    1 An rvalue of a floating point type can be converted to an rvalue of an integer type. The conversion truncates; that is, the fractional part is discarded. The behavior is undefined if the truncated value cannot be represented in the destination type.

  3. #3
    Membre émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut
    Merci bien de ta réponse. Je crois que la question est résolue.

    Citation Envoyé par Sylvain Togni Voir le message
    Comportement indéfini, le compilateur à le droit de faire ce qu'il veut. Tu as eu de la chance il aurait pu reformater ton disque dur
    Oui, mais je suis pas con, je le fais pas tourner en root.

    Sinon, où as-tu trouvé ce document ? Y'a moyen de le télécharger quelque part ?

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    La norme est payante...

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    ... mais certains drafts non

    Bon, c'est à prendre avec des pincettes, c'est pas la version définitive, mais certains points comme celui là il n'y a pas trop de risques.

  6. #6
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Tant qu'a faire un autre draft en pdf cette fois :

    http://www.open-std.org/jtc1/sc22/wg...2005/n1905.pdf


    Mais bon, fait gaffe c'est pas la norme définitive.

  7. #7
    Membre émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut
    Merci bien. Même un draft, c'est pas mal pour la plupart des cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion Float vers char[4]
    Par Argol_Medusa dans le forum C++
    Réponses: 16
    Dernier message: 02/05/2008, 15h15
  2. [C] cast float *
    Par vince3320 dans le forum C
    Réponses: 14
    Dernier message: 26/02/2008, 16h12
  3. [INGRES II] cast d'une char[] en int
    Par prem's dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 05/04/2007, 15h11
  4. cast float vers int
    Par planeur2007 dans le forum C
    Réponses: 5
    Dernier message: 13/03/2007, 18h39
  5. [(cast)] convertir un char en int...
    Par APoLLoN1234 dans le forum C++
    Réponses: 12
    Dernier message: 15/03/2006, 23h15

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