Règles de promotion avec des opérateurs gérant des entiers signés et non signés
Lorsqu'il s'agit d'opérateurs binaires impliquant des signatures différentes entre leurs opérandes, les règles de promotion décrites dans le standard C entre en jeu. Ces règles déterminent le type résultant de l'opération et la manière dont les opérandes sont convertis.
Plus précisément, les "conversions arithmétiques habituelles" s'appliquent ici (§5/9). Ces conversions sont classées par priorité décroissante :
- Double longue (si présente)
- Double
- Flottant
- Promotions intégrales (conversion courte/int /long long à int/long/long long)
- Long non signé (si présent)
- Long si long int peut représenter toutes les valeurs int non signées, ou unsigned long int sinon
- Long (si présent)
- Non signé (si présent)
Application de ces règles aux deux scénarios présentés :
Scénario 1 :
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
- max est signé int, un est non signé int
- Des promotions intégrales se produisent, ce qui donne max comme int
- Depuis unsigned int est classé plus haut, le type de résultat est unsigned int
- Résultat : débordement non signé vers 2147483648
Scénario 2 :
unsigned int us = 42;
int neg = -43;
int result = us + neg;
- us est unsigned int, neg est signé int
- Des promotions intégrales se produisent, ce qui nous donne un int non signé, négatif comme int
- Puisque unsigned int est classé plus haut, le type de résultat est unsigned int
- Cependant, la valeur de us neg (-1) n'est pas représentable dans int
- Result : Comportement défini par l'implémentation, renvoyant probablement -1 ou dépendant de la plate-forme
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Déclaration:Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn