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
Libérer: 2024-11-26 08:27:10
original
806 Les gens l'ont consulté

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;
}
Copier après la connexion

Le programme produit ce qui suit sortie :

0
2147483647
-2147483648

0
4294967295
0
Copier après la connexion

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!

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