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

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

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

整数除法实际上是否使用引擎盖下的FPU?

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

man signal提到:

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

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

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

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