Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1622 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Comment détecter un débordement sur les multiplications d'entiers en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment détecter un débordement sur les multiplications d'entiers en C

n°1621883
eliane1
Posté le 10-10-2007 à 21:15:32  profilanswer
 

Bonjour à tous!
 
J'aurais besoin de faire une validation dans un programme mais je n'arrive pas a voir comment la faire.
Je doit pouvoir vérifier s'il ya eu débordement à la suite d'une multiplication sur des entiers non signés en C.
 
Dison que j'ai des variables du genre:
 
unsigned int a = ...; //où ... veut dire peu importe l'entier valide
unsigned int b = ...;
 
unsigned int c = a * b;
 
Je doit donc faire une validation sur c pour voir s'il y a eu débordement/overflow mais je ne vois pas comment faire.
 
Merci d'avance pour votre aide.

mood
Publicité
Posté le 10-10-2007 à 21:15:32  profilanswer
 

n°1621886
tpierron
Posté le 10-10-2007 à 21:28:03  profilanswer
 

Bah avec un test à la con du genre :
 
#include <limits.h>
 
if (UINT_MAX / b > a) puts("haha, bien tenté" )


Message édité par tpierron le 10-10-2007 à 21:28:48
n°1621890
eliane1
Posté le 10-10-2007 à 21:35:45  profilanswer
 

Je vois, merci c'est bien mais ya pas moyen de faire ce truc sans include <limits.h> et seulement avec des opératiers arithmétiques.. un truc logique que j'aurais pas pigé du genre pour une addition tu verrifierais si les deux variables a et b sont de même signe et si la variable b est du signe contraire il y a eu débordement. Merci parcontre.
 
edit: Oh et dans l'exemple d'addition que j'ai mentionné sa s'applique aux entiers signés mais bon, ce genre de validation.


Message édité par eliane1 le 10-10-2007 à 21:42:50
n°1621904
Darko_
Posté le 10-10-2007 à 22:12:29  profilanswer
 

Pour la multiplication, il ne suffit pas de vérifier les signes de a et b.
En fait il n'y a pas d'algo simple pour ça.
 
Par contre tu peux faire le calcul avec un c qui serait un unsigned long long (si sur ta machine un long long est au moins deux fois plus grand qu'un int) et de vérifier si c appartient à [INT_MIN; INT_MAX]
 
genre :
 
unsigned int a,b,c;
unsigned long long tmp = unsigned long long)a * (unsigned long long)b;
 
if ( (tmp > INT_MAX) || (tmp < INT_MIN) ) {
  /* Débordement */
}
c = (unsigned int)tmp;
 

n°1621920
eliane1
Posté le 10-10-2007 à 22:51:12  profilanswer
 

LOL je viens d'y penser et je croit qu'un simple if(c/b) != a fonctionnerais. Dite moi le si c'est faux mais sa me semble logique.

n°1621925
tpierron
Posté le 10-10-2007 à 23:20:00  profilanswer
 

Mouais, ça me semble tout aussi bien, sinon mieux. À vérifier que b != 0, comme je ne l'ai pas fait dans mon exemple.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Comment détecter un débordement sur les multiplications d'entiers en C

 

Sujets relatifs
[Resolu] Parcourir tout les fichier d'un dossier et detecter des mots[C#] Détecter le survol de la fenêtre
Détecter les battements par minutes dans un MP3détecter des ligne sur un eimage texte
Detecter un texte dans une page php[C]Remplir un tableau d'entiers uniques aléatoirement
VBA - Détecter commande "Imprimer" dans ExcelVBA - Détecter sélection plusieurs cellules...résolu
Détecter évenement "Nouveau message" dans Access 2000[Lingo] detecter les collisions
Plus de sujets relatifs à : Comment détecter un débordement sur les multiplications d'entiers en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR