C++ effet de bor(d sur u8

zeralph Messages postés 1 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 31 mars 2010 - 31 mars 2010 à 19:59
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 - 2 avril 2010 à 16:42
Bonjour !
je me permets de poster un petit sujet ici car je suis tombé sur un effet de bord que je juge étrange, et j'aimerais vous en faire part, car peut-être savez-vous d'où il vient.

Il s'agit de code compilé en c++ sur xbox360. Le sujet serait peut être plus approprié sur les forums de Microsoft, mais peut être connaissez vous déjà cela.
voila le sujet :

soit foo un u8 et bar un u8
je teste des index qui bouclent en u8, soit entre 0 et 255.
je fais donc
if( (foo+1) == bar )

Et la, je me retrouve avec un comportement différent que si je fais
u8 temp = foo +1;
if(temp == bar);


C'est a dire que (foo+1) peut donner 256 (c'est a dire que le résultat de foo+1 est casté en s16 par défaut ?? au lieu de donner 0 (255+1). Alors que temp est bien casté en u8 (heureusement, d'ailleurs).

c'est la première fois que je tombe la dessus, et j'aurais aimé savoir s'il vous etait déjà arrivé la même chose, et sur quels compilateurs.

merci de votre attention
Lucas

1 réponse

ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
2 avril 2010 à 16:42
Bonjour,

Il s'agit d'un problème de conversion implicite, prenons par exemple les lignes suivantes :

unsigned char c = 255;
unsigned char d = c + 1;
int i = c + 1;

d vaudra 0 et i 256 car le résultat c + 1 est implicitement converti en int avant l'affectation. Lors de l'affectation à d, la conversion est faite en unsigned char.

Par contre si on écrit :

int i = (unsigned char)(c + 1);

alors i vaudra 0 car on caste explicitement le résultat avant l'affectation.

Donc dans ton cas, tu pourrais écrire :

if( (u8)(foo+1) == bar )
0
Rejoignez-nous