Est-ce que bit shift promeut automatiquement les caractères en int?

J’ai lu quelque part que le décalage au niveau du bit transforme automatiquement l’opérande en un int. Mais je ne suis pas sûr si cette déclaration devrait être qualifiée de “si les opérandes sont de type différent”.

char one = 1, bitsInType = 8; one << (bitsInType - one); 

Le résultat par défaut de la deuxième ligne donne-t-il un entier ou un caractère?

Le type de résultat est int dans les implémentations C normales. 1

Per C 2011 (N1570) 6.5.7, «Les promotions sur les entiers sont effectuées sur chacun des opérandes. Le type de résultat est celui de l’opérande de gauche promu. ”

Conformément à 6.3.1.1 2, les promotions d’entier sont les objects ou expressions de type entier dont le rang est inférieur ou égal au rang de int et unsigned int : «Si un int peut représenter toutes les valeurs du type original (telles que width, pour un champ de bits), la valeur est convertie en int ; sinon, il est converti en un unsigned int . ”


1 Il y a eu des discussions ailleurs dans Stack Overflow, à partir desquelles il semble qu’une implémentation C bizarre pourrait avoir un caractère de même largeur int , ce qui conduit à un comportement inhabituel.

Norme C11, section 6.5.7 Opérateurs de décalage au niveau du bit, stipule:

Les promotions entières sont effectuées sur chacun des opérandes. Le type de résultat est celui de l’opérande gauche promu.

Cela signifie que les valeurs sont converties en int , puis l’opération est effectuée. le résultat de votre expression est int .