为什么整数除以零会导致浮点异常?

时间:2013-06-04 23:08:00

标签: c divide-by-zero

在C程序中除以零会导致异常终止,并显示错误消息Floating point exception (core dumped)。这对于浮点除法并不足为奇,但为什么在整数除以零时会这样说呢?整数除法实际上是否使用引擎盖下的FPU?

(顺便说一下,这是在x86下的Linux上。)

4 个答案:

答案 0 :(得分:22)

  

整数除法是否真的使用引擎盖下的FPU?

不,Linux也只是在这种情况下生成SIGFPE(它是一个遗留名称,其使用现已扩展)。实际上,单Unix规范defines SIGFPE为“错误的算术运算”。

答案 1 :(得分:3)

man signal提及:

  

整数除零具有未定义的结果。在某些架构上,它将生成SIGFPE信号。 (也将最负整数除以-1可能会生成SIGFPE。)

答案 2 :(得分:2)

我对此的历史解释的猜测是原始的unix硬件没有在整数除以零上生成陷阱,因此名称SIGFPE是有意义的。 (PDP组装程序员,确认?)然后,当系统被移植(或者在Linux的情况下,重新实现)到具有整数被零除陷阱的硬件时,不值得添加新的信号编号,所以旧的获得了一个新的含义,现在有一个有点混乱的名字。

答案 3 :(得分:0)

可能存在许多不同的特定于实现的原因。

例如,x86平台上的FPU单元支持浮点和整数格式,用于读取参数和写入结果。当平台本身为16位时,一些编译器使用FPU来执行32位整数操作数的划分(因为32位宽数据没有精度损失)。在这种情况下,对于无效的32位整数除法,获得正版FPU错误没有什么异常。

相关问题