2009-12-14 4 views
1

Ne fonctionne pas comme prévu car il ne définit pas le bit MSB correct. J'utilise le compilateur metrowerks.passer à droite/ce que je fais mal?

//shifting right 5 characters 
char * buffer; 
buffer=global_buffer; 
for(i=0;i<5;i++) //shift right for 1; 
{ 
    buffer[17-i]=(buffer[17-i]>>1)|(buffer[17-i-1]<<7); 
} 

tampon d'entrée EDIT (juste avant de boucle) 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x2F, 0xA0, 0xC6,0x9D

i obtenu après boucle 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x17,0xD0,0xE3,0xCE

+6

Définir "correct". Quelle est votre contribution? Quelle sortie attendez-vous? Quel résultat voyez-vous? – jason

+0

Votre compilateur implémente "char" comme "char signé". Utilisez l'une des réponses ci-dessous pour éviter que la valeur décalée ne garde le bit de signe intact. –

Répondre

9

Vous voulez probablement "unsigned char * buffer;" Cela va déplacer les zéros dans les bits supérieurs plutôt que de conserver le bit de signe.

+0

Le décalage vers la droite d'une valeur signée ne conserve pas toujours le bit de signe. Voir la réponse de Steve Jessops. Voir aussi une partie de la discussion avec la question: http://stackoverflow.com/questions/1857928/right-shifting-negative-numbers-in-c – Trent

+1

@Trent: Je ne lui ai pas dit de virer à droite une valeur signée. Je lui ai dit de corriger une valeur non signée. –

+0

@Trent: En fait, comme votre lien l'indique, même les quarts de travail signés fonctionnent normalement comme prévu. Je ne suis pas au courant d'une architecture (dans l'utilisation courante) qu'ils n'ont pas. –

2

"il ne définit pas le bit MSB correct".

La norme C dit:

6.5.7/5 ... Si E1 a un type signé et une valeur négative, la valeur résultante est définie par l'implémentation.

Voir ce projet, par exemple: http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

On peut supposer que char est signé sur votre compilateur, de sorte que vous devriez vérifier votre compilateur docs pour voir quelle est la valeur correcte du MSB. Et tous les autres bits.

Questions connexes