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
Libérer: 2024-11-17 08:15:03
original
917 Les gens l'ont consulté

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;
}
Copier après la connexion
Remplacement d'entier signé :

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

0
4294967295
0
Copier après la connexion
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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal