繁体   English   中英

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

[英]Why does integer division by zero result in a floating point exception?

在C程序中除以零会导致异常终止,并显示错误消息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错误没有什么异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM