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 :
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.
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));
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.
Partager