C++ effet de bor(d sur u8

Signaler
Messages postés
1
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
31 mars 2010
-
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
-
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

Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
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 )