Salut à tous,

Je suis nouveau sur le forum mais pas dans le langage C
Ceux pour qui la notion de "integer promotion" ne veut rien dire peuvent s'arrêter de lire ici

J'ai un soucis avec le code suivant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
   volatile unsigned char v = 128;
   v = v >> 7;
   printf ("volatile unsigned char: %d\n", v);
qui affiche 255 au lieu de 1 lorsqu'il est compilé avec ICC sous linux.

J'ai la solution pour éviter le problème: il suffit de caster v et d'écrire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
   v = ((unsigned int) v) >> 7;
Cependant, je ne comprends vraiment pas comment on peut arriver à 255, sauf si le compilo ICC ne sait pas faire de promotion d'entier.

Normalement, la bonne marche (conforme aux normes en vigueur) veut que:
- soit le compilo fait du "unsigned preserving", auquel cas v est converti en "unsigned int" avant décalage et tout se passe bien,
- soit le compilo fait du "value preserving", auquel cas il devrait convertir v en "int" avec la valeur positive 128 (et non 0xffffff80 comme il semble faire, c'est-à-dire comme si v était négatif parce qu'il a son bit de poids fort à 1...).

Je ne comprends donc pas ce qu'il peut bien se passer.

Des idées ?