L'arithmétique Exception dans gdb, mais je ne suis pas diviser par zéro?
J'ai été faire un Floating point exception (core dumped)
erreur dans mon programme en C++, et gdb montre que le problème est sur une ligne qui effectue une division modulo:
Program received signal SIGFPE, Arithmetic exception.
[Switching to Thread 0x7ffff6804700 (LWP 13931)]
0x00000000004023e8 in CompExp::eval (this=0x7fffec000e40, currVal=0)
at exp.cpp:55
55 return (r==0) ? 0 : l % r;
La ligne en garde contre la division par zéro et mon backtrace affiche les éléments suivants:
#0 0x00000000004023e8 in CompExp::eval (this=0x7fffec000e40, currVal=0)
at exp.cpp:55
l = -2147483648
r = -1
Car je sais que je ne suis pas diviser par zéro, quoi d'autre pourrait éventuellement être la cause de l'exception?
- Le modulo d'un nombre négatif n'est pas défini, c'est probablement que, vous devriez probablement avoir (r <= 0)
- Intéressant, l'opération, à mon avis, un sens pour un nombre négatif, mais vous avez raison.
Vous devez vous connecter pour publier un commentaire.
Alors j'ai pensé que ce qui était à l'origine du problème-Une arithmétique exception peut être déclenchée soit par la division par zéro, ou de dépassement d'un signé entier, qui est ce qui s'est passé ici. Des entiers non signés sont tenus de s'enrouler autour d'lorsque débordé; le comportement pour les entiers signés est pas défini.
Modifier le code à la suite pour éviter d'essayer de prendre le modulo d'un nombre négatif qui n'est pas défini:
int i = -2147483648 % -1;
, alors il n'y a pas d'exception, donc je ne pense pas que ce serait un problème de prendre le modulo d'un nombre négatif.i
est affectée au résultat de l'expression lors de la compilation, et non pas au moment de l'exécution.Afin de calculer ces modulo expression:
-2147483648 % -1
, une division est nécessaire, dans ce cas, semble être une version 32 bits de division (je suppose quel
etr
sont définis commeint
). Le bon résultat de cette division serait2147483648
, mais cette valeur ne peut pas être représenté en 32 bits, donc une arithmétique exception est produite.