17

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

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

4

4 回答 4

24

整数除法是否实际上使用了 FPU?

不,Linux 在这种情况下也只会生成 SIGFPE(它是一个旧名称,现在已经扩展了它的使用范围)。事实上,Single Unix Specification将 SIGFPE 定义为“错误的算术运算”。

于 2013-06-04T23:10:29.160 回答
5

man signal提到:

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

于 2013-06-04T23:16:11.890 回答
5

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

于 2013-06-04T23:33:50.817 回答
1

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

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

于 2013-06-05T00:05:46.147 回答