En lisant la promotion de nombre entier et le rang de conversion de nombre entier, j’ai trouvé ce lien
- 1.Si les deux opérandes ont le même type, aucune conversion supplémentaire n’est nécessaire.
- 2. Sinon, si les deux opérandes ont des types entiers signés ou que les deux ont des types entiers non signés, l’opérande avec le type de rang de conversion de nombre entier inférieur est converti en type de l’opérande avec le rang le plus élevé.
3. Sinon, si l’opérande qui a un type entier non signé a un rang supérieur ou égal au rang du type de l’autre opérande, l’opérande avec le type entier signé est converti en type de l’opérande avec le type entier non signé.
4. Sinon, si le type de l’opérande de type entier signé peut représenter toutes les valeurs du type de l’opérande de type entier non signé, l’opérande de type entier non signé est converti en type de l’opérande de type entier signé. .
5. Sinon, les deux opérandes sont convertis en un type entier non signé correspondant au type d’opérande avec un type entier signé.
- Comstackz le projet libtiff pour iOS pour inclure une architecture 64 bits
- Comment créer un processus de manière portable?
- Insérer une entrée client dans la firebase database MySQL avec C
- Pourquoi le compilateur peut-il supposer que l’adresse d’une variable globale correspondra à 32 bits?
- parsing de la chaîne d’adresse IP en 4 octets simples
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
.