为啥会产生浮点异常?
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 允许的其他两种编码方案(反码和符号/大小)在正值和负值之间具有直接的一对一映射)。同样有趣的是,几乎没有人使用它们:-)
【讨论】:
以上是关于为啥会产生浮点异常?的主要内容,如果未能解决你的问题,请参考以下文章