6

我的Floating point exception (core dumped)C++ 程序出现错误,gdb 显示问题出在执行模除法的行上:

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;

该行防止被零除,我的回溯显示如下:

#0  0x00000000004023e8 in CompExp::eval (this=0x7fffec000e40, currVal=0)
    at exp.cpp:55
        l = -2147483648
        r = -1

既然我知道我没有除以零,还有什么可能导致异常?

4

3 回答 3

8

所以我找出了导致问题的原因——算术异常可以通过除以零或有符号整数溢出来触发,这就是这里发生的情况。无符号整数溢出时需要回绕;有符号整数的行为未定义。

于 2012-12-31T22:02:15.373 回答
5

将代码更改为以下内容,以避免尝试对未定义的负数取模:

return (r<=0) ? 0 : l % r;
于 2012-12-31T05:49:30.220 回答
2

为了计算这样的模表达式:-2147483648 % -1,需要一个除法,在这种情况下,它似乎是一个 32 位除法(我猜l并且r被定义为int)。这种除法的正确结果是2147483648,但该值不能用 32 位表示,因此会产生算术异常。

于 2017-08-04T13:11:07.630 回答