2013-06-04 96 views
14

C程序中的零除会导致异常终止,并显示错误消息Floating point exception (core dumped)。这对于浮点除法来说并不令人惊讶,但为什么当整数除零时发生这种情况呢?整数除法实际上是在引擎盖下使用FPU吗?为什么整数除零会导致浮点异常?

(这是所有在Linux下x86的,顺便说一句。)

+1

值得注意的是,其他非POSIX操作系统(例如Windows)和x86硬件报告了整数和浮点除零的不同例外。 – Crashworks

+0

相关:[在整数除以零的平台上触发浮点异常?](https://stackoverflow.com/questions/37262572/on-which-platforms-does-integer-divide-by-zero-trigger-一个浮点-抗辩)。 TL:DR:如果有信号,POSIX要求它是SIGFPE。 –

回答

22

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

不,Linux在这种情况下也会生成SIGFPE(这是一个传统名称,现在它的用法已被扩展)。事实上,Single Unix Specification defines SIGFPE被视为“错误的算术运算”。

3

man signal提到:

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

1

我的猜测在这个历史的解释是原来的Unix硬件没有通过零产生整数除法陷阱,所以名称SIGFPE有意义。 (PDP汇编程序员,确认?)然后,当系统被移植(或在Linux的情况下,重新实现)到具有整数除零陷阱的硬件时,添加新的信号编号并不值得旧的获得了新的含义,现在有一个轻微混淆的名字。

0

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

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

+0

FP异常通常被屏蔽,所以您只需获得NaN或+/- Inf结果而不是异常。我不知道在x86之前是否开始使用整数除法例外惯例/传统的SIGFPE?我想,在386(保护模式)之前,Unix无法正确地移植到x86上,但是一些没有真正内存保护的类Unix环境存在。 –

相关问题