J'aidais quelqu'un à faire ses devoirs et j'ai été confronté à ce problème étrange. Le problème est d'écrire une fonction qui inverse l'ordre des octets d'un entier signé (C'est ainsi que la fonction a été spécifiée de toute façon), et c'est la solution que je suis venu avec:Décalage à droite signé = résultat étrange?
int reverse(int x)
{
int reversed = 0;
reversed = (x & (0xFF << 24)) >> 24;
reversed |= (x & (0xFF << 16)) >> 8;
reversed |= (x & (0xFF << 8)) << 8;
reversed |= (x & 0xFF) << 24;
return reversed;
}
Si vous passez 0xFF000000
à cette fonction, la première affectation aura pour résultat 0xFFFFFFFF
. Je ne comprends pas vraiment ce qui se passe, mais je sais que cela a quelque chose à voir avec les conversions entre les signataires et les non signés, ou quelque chose comme ça.
Si j'applique ul
à 0xFF
cela fonctionne très bien, ce que je suppose est parce qu'il est forcé à non signé puis converti en signé ou quelque chose dans cette direction. Le code résultant change également; sans le spécificateur ul
, il utilise sar (arithmétique de décalage à droite), mais comme non signé, il utilise shr comme prévu.
J'apprécierais vraiment si quelqu'un pourrait éclaircir cela pour moi. Je suis supposé savoir ce genre de choses, et je pensais que c'était le cas, mais je ne suis pas vraiment sûr de ce qui se passe ici.
Merci d'avance!
* Pourquoi * vous déclarez '' reversed' comme unsigned'? –
"J'aidais quelqu'un à faire ses devoirs" .... alors s'il vous plaît retag comme "devoirs". –
Konrad: Ah, c'est une erreur. Je le réparerai. J'essayais différentes choses pour comprendre ce qui se passait. – identity