Maison >développement back-end >C++ >En quoi les débordements d'entiers signés et non signés diffèrent-ils en C ?

En quoi les débordements d'entiers signés et non signés diffèrent-ils en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-26 08:27:10884parcourir

How do signed and unsigned integer overflows differ in C  ?

Comportement de débordement d'entiers dans les entiers signés et non signés

Contexte

Lorsque vous travaillez avec des entiers dans C , il est crucial de comprendre le comportement du débordement d'entier, qui se produit lorsqu'un entier la valeur dépasse sa valeur représentable maximale ou minimale. Cet article vise à expliquer les différents résultats du débordement d'entiers signés et non signés, en fonction des résultats observés dans un programme spécifique.

Programme et sortie

Le programme suivant a été utilisé pour tester le débordement d'entier :

#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 programme produit ce qui suit sortie :

0
2147483647
-2147483648

0
4294967295
0

Explication

Dépassement d'entier signé

Le dépassement d'entier signé est un comportement indéfini en C . Cela signifie que le résultat n'est pas garanti et dépend de la mise en œuvre. Dans ce cas, la valeur de x après la deuxième opération d'incrémentation revient à la valeur minimale négative du type de données, ce qui donne -2147483648. En effet, la plupart des implémentations utilisent la représentation du complément à 2 pour les entiers signés.

Dépassement d'entier non signé

Le dépassement d'entier non signé est bien défini en C . Le résultat est calculé par arithmétique modulo, où la valeur revient à la valeur minimale du type de données. Dans ce cas, la valeur de y après la deuxième opération d'incrémentation revient à 0.

Résumé

En résumé, le dépassement d'entier signé est un comportement indéfini, tandis que l'entier non signé le débordement est bien défini et entraîne un emballage de valeur. Par conséquent, il est important de gérer soigneusement le débordement d'entier dans les programmes C pour éviter des résultats inattendus.

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