在 C 程序中除以零会导致异常终止并显示错误消息Floating point exception (core dumped)
。这对于浮点除法来说并不奇怪,但是为什么当整数除以零时会这样说呢?整数除法是否实际上使用了 FPU?
(顺便说一下,这都是在 x86 下的 Linux 上。)
在 C 程序中除以零会导致异常终止并显示错误消息Floating point exception (core dumped)
。这对于浮点除法来说并不奇怪,但是为什么当整数除以零时会这样说呢?整数除法是否实际上使用了 FPU?
(顺便说一下,这都是在 x86 下的 Linux 上。)
整数除法是否实际上使用了 FPU?
不,Linux 在这种情况下也只会生成 SIGFPE(它是一个旧名称,现在已经扩展了它的使用范围)。事实上,Single Unix Specification将 SIGFPE 定义为“错误的算术运算”。
man signal
提到:
整数除以零有未定义的结果。在某些架构上,它会生成一个 SIGFPE 信号。(同样将最大负整数除以 -1 可能会生成 SIGFPE。)
我对此的历史解释的猜测是原始的 unix 硬件没有在整数除以零时产生陷阱,所以这个名字SIGFPE
是有道理的。(PDP 汇编程序员,确认?)然后当系统被移植(或在 Linux 的情况下,重新实现)到具有整数除零陷阱的硬件时,添加新的信号编号被认为不值得,所以旧的获得了新的含义,现在有了一个有点混乱的名字。
这可能有许多不同的特定于实现的原因。
例如,x86 平台上的 FPU 单元支持浮点和整数格式来读取参数和写入结果。回到平台本身是 16 位的时候,一些编译器使用 FPU 对 32 位整数操作数执行除法(因为 32 位宽数据没有精度损失)。在这种情况下,对于无效的 32 位整数除法得到真正的 FPU 错误并没有什么不寻常的。