Probleme avec un "right shift"
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:
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:
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 ?
Re: Probleme avec un "right shift"
Citation:
Envoyé par divad38
Je suis nouveau sur le forum mais pas dans le langage C :)
Ceux pour qui la notion de "promotion d'entier" ne veut rien dire peut s'arrêter de lire ici ;)
Effectivement ça ne veut rien dire. char peut être promu, short, aussi, mais 'entier', je ne connais pas.
Donc, je m'arrête ... Can't resist...
Ton code est incomplet. Il ne compile pas.
Manque <stdio.h>
Je ne suis pas sûr de la promotion d'un unsigned char en int. Dans le doute, je caste et je mets les formatteurs qui vont bien...
Ceci est complet et est correct :
Code:
1 2 3 4 5 6 7 8 9 10
|
#include <stdio.h>
int main(void)
{
volatile unsigned char v = 0x80;
v >>= 7;
printf ("volatile unsigned char: %u\n", (unsigned) v);
return 0;
} |
Sortie :
Code:
1 2
|
volatile unsigned char: 1 |
Re: Probleme avec un "right shift"
Citation:
Envoyé par Emmanuel Delahaye
Citation:
Envoyé par divad38
Je suis nouveau sur le forum mais pas dans le langage C :)
Ceux pour qui la notion de "promotion d'entier" ne veut rien dire peut s'arrêter de lire ici ;)
Effectivement ça ne veut rien dire. char peut être promu, short, aussi, mais 'entier', je ne connais pas.
Donc, je m'arrête.
In english we say "integer promotion".
If you don't care, we can continue in english, never mind.
Thanks for your precious help.