Question

Le décalage à gauche de (char) 0xff par 8 et le jetant int nous obtenons -256 ou 0xffffff00. Quelqu'un peut-il expliquer pourquoi cela se produit?

#include <stdio.h>
int main (void)
{   
    char c = 0xff;
    printf("%d %x\n", (int)(c<<8),(int)(c<<8));
    return 0;
}

La sortie est

-256 ffffff00
Était-ce utile?

La solution

char peut être signé ou non signé - il est défini par l'implémentation. Vous voyez ces résultats parce que char est signé par défaut sur votre compilateur.

Pour la 0xFF signed char correspond à -1 (qui est la façon dont le travail de complément à deux). Lorsque vous essayez de le déplacer, il est d'abord promu à un int puis déplacé -. Vous obtenez efficacement la multiplication par 256

Il est donc ce code:

char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );

Autres conseils

Quand je regardais le problème, mon point de vue initial était que le char « c » doit être décalée vers la gauche 8 bits -. Tous les 8 bits étant mis au rebut, le vide omble chevalier serait alors jeté à un int de valeur 0

Un peu de recherche révèle habituelles conversions unaires - c'est là pour réduire le grand nombre de types arithmétiques, les conversions sont automatiquement appliquées à opérandes du unaire, « ! » « - », « ~ 'et '' opérateurs, et à chacun des opérandes du binaire '* <<' et 'opérateurs' >>.

Par conséquent, le caractère 'c' est converti en un int premier , puis décaler vers la gauche, ce qui donne la réponse que vous voyez.

Vous apprenez quelque chose de nouveau chaque jour!

c est promu à un int avant l'opération de changement de vitesse est effectué. En supposant que votre mise en œuvre rend les caractères signés par défaut, cela signifie que vous allez obtenir 0xffffffff, qui est ensuite décalé vers la gauche pour donner à votre résultat.

Si vous faites c dans un unsigned char, vous devriez obtenir ce que vous attendez.

char est rien, mais signed char. Alors char c = 0xFF sera -1. Lorsque vous avez quitté -1 changement par 8 bits vous obtenez -256.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top