9
votes

Comment éviter le débordement entier?

Dans le code C ++ suivant, 32767 + 1 = -32768.

#include <iostream>
int main(){
short var = 32767;
var++;
std::cout << var;
std::cin.get();
}


4 commentaires

Obtenez-vous ce qui se passe ici? Vous avez frappé le plafond pour un entier (court), l'ajout d'un autre retourne les panneaux à la quantité négative maximale pour un entier.


Si vous voulez un mode différent où les entiers n'enveloppent pas automatiquement, il n'existe pas, désolé.


Cela me rappelle pourquoi je ne peut pas dormir . :-)


Ceci s'appelle Saturation Arithmétique . Cela peut être très illogique, alors soyez averti. Qu'est-ce que 32767 + 1-1?


3 Réponses :


31
votes

Oui, il y a:

short var = 32767;
increment_without_wraparound(var); // pick a shorter name!


0 commentaires

0
votes
#include <iostream> 
int main(){ 
unsigned short var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 

1 commentaires

Cela répond à la question qui a été posée, mais pas, je soupçonne que la question qui était destinée.



-1
votes

Utilisez 'Int Int Int Int' ou 'Long Int'

#include <iostream>
int main(){
long int var = 32767;
var++;
std::cout << var;
std::cin.get();
}


2 commentaires

Puis x = 32676; x ++ entraînera X == 32677, pas 32676.


OK, alors comment évitez-vous le débordement sur un entier non signé 64 bits?