rang de conversion et promotion

En lisant la promotion de nombre entier et le rang de conversion de nombre entier, j’ai trouvé ce lien

Les points 1 2 3 sont parfaitement clairs mais je ne donne toujours pas d’exemple pour les cas 4 et 5. Quelqu’un peut-il donner un exemple concernant une mise en œuvre quelconque?

Comme je le sais, le classement de conversion entier est:

_Bool <char <short <int <long <long long int

Quelle que soit la taille des octets liés aux types sont égaux ou supérieurs. Droite?

Concernant la promotion ou la conversion d’un type à l’autre. Les bits ajoutés au type le plus bas, zéro ou 1, ou le bit extrême gauche ont-ils un effet?

Je veux savoir comment se déroule le processus dans la vue bits, en particulier pour la conversion.

Pour la promotion de nombre entier, il peut toujours conserver la valeur et le signe sans aucun doute.

Le cas 4 s’applique si vous avez un type non signé dont le rang est inférieur au type signé avec lequel il fonctionne et dont les tailles sont différentes . Cas 5 alors si les deux ont la même taille .

Par exemple, sur mon système, int est en 32 bits, long 64 bits et long long 64 bits. Si vous avez alors les éléments suivants:

 unsigned int a; // range: 0 to 4294967295 long b; // range: -9223372036854775808 to 9223372036854775807 unsigned long c; // range: 0 to 18446744073709551615 long long d; // range: -9223372036854775808 to 9223372036854775807 

Pour une expression impliquant a et b , unsigned int et long , tout unsigned int valide peut tenir dans un long . Donc, a est converti à long dans cette situation.

Inversement, pour une expression impliquant c et d , qui sont unsigned long long long , long long ne peut contenir toutes les valeurs d’un unsigned long . Donc, les deux opérandes sont convertis en unsigned long long .

En ce qui concerne ce qui se passe lors d’une promotion / conversion au niveau du bit, supposons d’abord que le type de rang le plus bas est inférieur au type de rang le plus élevé et que les types signés utilisent la représentation du complément à 2.

Pour une conversion d’un entier 32 bits en un long 64 bits, si la valeur est positive, 4 octets contenant tous les 0 bits sont ajoutés à gauche. Si la valeur est négative, 4 octets contenant tous les 1 bits sont ajoutés à gauche. Par exemple, la représentation de la valeur 5 passe de 0x00000005 à 0x0000000000000005 . Pour la valeur -5 , la représentation passe de 0xfffffffb à 0xfffffffffffffffb .