qu’est-ce que char i = 0x80 et pourquoi le débordement ne s’est pas produit en décalage de bits

Voici un programme

#include  main() { unsigned char i=0x80; printf("i=%d",i<<1); } 

La sortie qu’il donne est 256. Je ne comprends pas ce que fait

 unsigned char i=0x80; <-- i is not int it is char so what will it store? 

Je sais des choses bitshift et hexadécimales. Comment la valeur de i est-elle stockée et comment passe-t-elle à 256?

METTRE À JOUR

Pourquoi le débordement n’a-t-il pas eu lieu lorsque l’opération de décalage de bit s’est produite?

En C, un caractère est un type entier utilisé pour stocker des données de caractère, généralement 1 octet.

La valeur stockée dans i est 0x80 une constante hexadécimale égale à 128 .

Une opération arithmétique sur deux types entiers (tels que i << 1 ) va passer au type plus large , dans ce cas à int , puisque 1 est une constante int. Dans tous les cas, les arguments des fonctions entières sont promus en int.

Ensuite, vous envoyez le résultat à printf , avec un spécificateur de format %d , ce qui signifie "imprimer un entier".

Je pense que K & R a la meilleure réponse à cette question:

2.7 Conversions de types Lorsqu’un opérateur a des opérandes de types différents, ils sont convertis en un type commun selon un petit nombre de règles. En général, les seules conversions automatiques sont celles qui convertissent un narrower'' operand into a plus large sans perdre d’informations, telles que la conversion d’un entier en virgule flottante dans une expression comme f + i. Les expressions qui n’ont pas de sens, comme l’utilisation d’un float en tant qu’indice, sont interdites. Les expressions susceptibles de perdre des informations, telles que l’affectation d’un type entier plus long à un plus court ou d’un type à virgule flottante à un entier, peuvent générer un avertissement, mais elles ne sont pas illégales. Un caractère est juste un petit nombre entier, donc les caractères peuvent être utilisés librement dans des expressions arithmétiques.

Donc, je << 1 convertit i en int avant qu'il ne soit décalé. Ken Vanerlinde a raison.

0x80 est hexadécimal pour 128 . L’opération x << 1 signifie un décalage à gauche de un qui multiplie effectivement le nombre par deux et le résultat est donc 256 .

i=0x80 enregistre la valeur hexadécimale 0x80 dans i. 0x80 == 128 .

Lors de l’impression de la valeur dans l’instruction de format printf() , la valeur transmise à l’instruction printf() est i<<1 .

<< L’opérateur << est l’opérateur de décalage gauche unaire unaire, qui déplace les bits de i vers la gauche.

128 en binary est «10000000», le décaler vers la droite donne un bit donnant «100000000» ou 256.

i << 1 n'est pas stocké dans i. Il n’ya donc pas de problème de débordement et 256 est la sortie.

Le code suivant donnera 0 comme sortie.

 #include  main() { unsigned char i=0x80; i = i<<1; printf("i=%d",i); }