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:
qui affiche 255 au lieu de 1 lorsqu'il est compilé avec ICC sous linux.
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);
J'ai la solution pour éviter le problème: il suffit de caster v et d'écrire:
Cependant, je ne comprends vraiment pas comment on peut arriver à 255, sauf si le compilo ICC ne sait pas faire de promotion d'entier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 v = ((unsigned int) v) >> 7;
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 ?
Partager