Maison >développement back-end >C++ >Pourquoi la surcharge de fonction provoque-t-elle une erreur avec la valeur entière la plus négative ?

Pourquoi la surcharge de fonction provoque-t-elle une erreur avec la valeur entière la plus négative ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-31 15:34:31404parcourir

Why Does Function Overload Cause an Error with the Most Negative Integer Value?

Erreurs de surcharge de fonctions ambiguës avec des valeurs entières négatives

Lors de la surcharge de fonctions en C, il est crucial de comprendre les exigences spécifiques et les limites des entiers négatifs littéraux. Prenons l'exemple suivant :

<code class="cpp">void display(int a) { cout << "int" << endl; }
void display(unsigned a) { cout << "unsigned" << endl; }

int main() {
    int i = -2147483648;
    cout << i << endl; // prints -2147483648
    display(-2147483648); // compilation error
}

On pourrait s'attendre à ce que toute valeur entière appelle display(int), tandis que les valeurs en dehors de la plage int seraient ambiguës. Cependant, l'erreur de compilation se produit spécifiquement lors de l'utilisation de la valeur int la plus négative, -2147483648.

Pourquoi l'erreur se produit

La clé réside dans l'absence de littéraux entiers négatifs en C. Les littéraux entiers ne peuvent pas commencer par un signe "-", ce qui signifie que -2147483648 est interprété comme l'opérateur de négation unaire appliqué à 2147483648.

Étant donné que 2147483648 dépasse la plage int, il est automatiquement promu en int long. L'ambiguïté survient lorsque display(-2147483648) est invoqué : le compilateur ne peut pas déterminer s'il doit appeler display(int) ou display(long int).

Gestion des exceptions

Ce comportement est observé lorsque le nombre négatif et sa représentation positive ont la même valeur binaire, comme avec -32768 en abrégé.

Éviter l'ambiguïté

Pour éviter toute ambiguïté , tenez compte des bonnes pratiques suivantes :

  • Utilisez std::numeric_limits pour récupérer les valeurs minimales et maximales d'un type de manière portable :
    std::numeric_limits : :min();
  • Convertir explicitement les valeurs négatives au type souhaité :
    display(static_cast(-2147483648));
  • En adhérant à ces directives, vous pouvez éviter toute ambiguïté et garantir que votre code fonctionne comme prévu.

    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