Maison >développement back-end >C++ >Pourquoi le dépassement d'entier en C conduit-il à des résultats différents pour les entiers signés et non signés ?

Pourquoi le dépassement d'entier en C conduit-il à des résultats différents pour les entiers signés et non signés ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-12 01:37:03824parcourir

Why does integer overflow in C   lead to different results for signed and unsigned integers?

Résultats inattendus d'un dépassement d'entier signé/non signé

En C, un dépassement d'entier peut conduire à des résultats inattendus en fonction de la signature du type de données .

Considérez ce qui suit programme :

#include <iostream>

int main()
{
    int x(0);
    std::cout << x << std::endl;

    x = x + 2147483647;
    std::cout << x << std::endl;

    x = x + 1;
    std::cout << x << std::endl;
    std::cout << std::endl;

    unsigned int y(0);
    std::cout << y << std::endl;

    y = y + 4294967295;
    std::cout << y << std::endl;

    y = y + 1;
    std::cout << y << std::endl;
}

Le résultat de ce programme peut vous surprendre :

0
2147483647
-2147483648

0
4294967295
0

Explication

Pour entiers signés, le comportement de débordement n'est pas défini. Dans la plupart des implémentations, le complément à 2 est utilisé, ce qui conduit à un comportement de bouclage inattendu. Par exemple, dans le programme ci-dessus :

  • x est initialisé à 0 puis déborde jusqu'à sa valeur positive maximale, 2147483647.
  • Lorsque 1 est ajouté à cette valeur débordée, il s'enroule autour de sa valeur négative minimale, -2147483648.

Pour entiers non signés, le débordement est bien défini et s'enroule modulo 2bits. Autrement dit, la valeur est remise à 0 en cas de dépassement du maximum. Cela explique le résultat de y, où y revient à 0 après avoir dépassé la valeur non signée maximale, 4294967295.

Il est important de noter que le comportement du dépassement d'entier signé n'est pas garanti par le langage et peut varier en fonction de la mise en œuvre et l'architecture de la machine. Par conséquent, il n'est généralement pas recommandé de s'appuyer sur un tel comportement dans vos programmes.

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