Maison >développement back-end >C++ >Pourquoi le dépassement d'entier entraîne-t-il un comportement différent pour les entiers signés et non signés ?

Pourquoi le dépassement d'entier entraîne-t-il un comportement différent pour les entiers signés et non signés ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-17 08:15:03937parcourir

Why does integer overflow result in different behavior for signed and unsigned integers?

Comprendre le débordement d'entier signé/non signé

Dans le processus d'apprentissage du débordement d'entier en C, les questions suivantes se sont posées :

Pourquoi est-ce que j'obtiens ces résultats avec un entier signé/non signé débordement ? :

Comprendre le débordement d'entier en C nécessite une compréhension des mots signés et types d'entiers non signés.

#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;
}
Remplacement d'entier signé :

Le dépassement d'entier signé est considéré comme un
0
2147483647
-2147483648

0
4294967295
0
comportement non défini

, ce qui signifie que le compilateur est il n'est pas nécessaire de spécifier le comportement exact lorsqu'un entier signé déborde. En pratique, la plupart des implémentations stockent les signés. entiers utilisant la représentation du complément à 2. Cela signifie que lorsqu'un entier signé déborde, sa valeur "s'enroule" dans la plage négative. Dans l'exemple, l'ajout de 1 à l'entier positif maximum (2147483647) à l'aide d'un entier signé donne -2147483648, le résultat. entier négatif minimum.

Entier non signé Débordement :

  • En revanche, le débordement d'entier non signé est bien défini
  • , la valeur revenant à zéro lorsqu'elle dépasse la valeur maximale. Dans l'exemple, ajouter 1 à l'entier non signé maximum (4294967295) donne 0. En effet, les entiers non signés n'ont pas de concept de valeurs négatives.

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