当 b 为零时,为啥 a%b 会产生 SIGFPE?

Posted

技术标签:

【中文标题】当 b 为零时,为啥 a%b 会产生 SIGFPE?【英文标题】:Why does a%b produce SIGFPE when b is zero?当 b 为零时,为什么 a%b 会产生 SIGFPE? 【发布时间】:2009-07-04 01:00:16 【问题描述】:

今天我正在跟踪我刚刚编写的一些代码中的浮点异常。花了一点时间才找到,因为它实际上是由取整数模零引起的。显然,不会定义任何 mod 零,但我认为错误如此具有误导性,这很奇怪。在 C++ 模运算符中,它将对两个整数使用浮点数是什么? (我使用的是 gcc 4.3.2)

这是一个演示错误的简单程序。

int main()

    int a=3,b=0;
    int c=a%b;
    return 0;

【问题讨论】:

【参考方案1】:

操作触发SIGFPE:

SIG 是信号的常用前缀 姓名; FPE 是 浮点异常。虽然 SIGFPE 不一定涉及 浮点运算,没有 无需更改名称的方法 破坏向后兼容性。

GDB 对此比较清楚,称之为“算术异常”:

(gdb) run
Starting program: /home/emil/float

Program received signal SIGFPE, Arithmetic exception.
0x0804837d in main () at float.c:4
4           int c=a%b;

【讨论】:

【参考方案2】:

看看this page。

您问题的相关部分:

SIG 是信号名称的常用前缀; FPE 是浮点异常的缩写。虽然 SIGFPE 不一定涉及浮点运算,但在不破坏向后兼容性的情况下无法更改其名称。

【讨论】:

以上是关于当 b 为零时,为啥 a%b 会产生 SIGFPE?的主要内容,如果未能解决你的问题,请参考以下文章

复数的基本知识

oracle group by 当值为零时,聚合 = 0

oracle用户设置登录次数为unlimit,为啥用户还是被锁

如何运用复数的代数表示式进行四则运算

为啥当你将函数的返回值乘以零时它不会短路?

在 HLSL 中进行 64 位加法,为啥我的一种实现会产生不正确的结果?