为啥会产生浮点异常?

Posted

技术标签:

【中文标题】为啥会产生浮点异常?【英文标题】:Why is this generating Floating point exception?为什么会产生浮点异常? 【发布时间】:2011-08-11 10:03:56 【问题描述】:

这是***的第二个例子SIGFPE 页面。

#include <limits.h>
int main(void)

    volatile int x=INT_MIN;
    volatile int y=-1;
    x=x/y;
    return 0;

它将符号反转为 INT_MIN 的正数。怎么可能是FPE?

【问题讨论】:

【参考方案1】:

***文章的答案:

... 触发信号,因为商,一个正数,是 无法表示。

INT_MIN / -1 = -INT_MIN
             = INT_MAX + 1
             => invalid number
             => floating point exception (FPE)

【讨论】:

【参考方案2】:

您是否阅读了 wiki 页面?它可能是 FPE,但它不是浮点异常。

虽然 SIGFPE 不一定涉及浮点 算术,没有办法改变它的名字而不破坏 向后兼容。

【讨论】:

【参考方案3】:

正如您链接到的页面所指出的那样,“尽管 SIGFPE 不一定涉及浮点运算,但在不破坏向后兼容性的情况下无法更改其名称”。

您收到信号的原因是二进制补码的工作方式。十六位二进制补码的范围(例如)是-32768..32767

换句话说,65,536 个可能的值映射到该范围。如果您尝试否定 INT_MIN,则没有任何表示可以为您提供正确的值(我们没有可用的 32768)。

所有二进制补码都是这种情况:八位给你-128..127,三十二位给你-2147483648..2147483647

在所有这些情况下,INT_MIN 没有积极的等价物。

有趣的是,ISO C 允许的其他两种编码方案(反码和符号/大小)在正值和负值之间具有直接的一对一映射)。同样有趣的是,几乎没有人使用它们:-)

【讨论】:

以上是关于为啥会产生浮点异常?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到“浮点异常(核心转储)”?

为啥引发异常会产生副作用?

为啥启用浮点异常后出现多个陷阱错误

当 b 为零时,为啥 a%b 会产生 SIGFPE?

在汇编中进行除法时出现浮点异常(核心转储)

浮点异常(Core Dumped)在汇编时进行除法