2011-08-11 83 views
3

这是维基百科SIGFPE 页面的第二个例子。这为什么会产生浮点异常?

#include <limits.h> 
int main(void) 
{ 
    volatile int x=INT_MIN; 
    volatile int y=-1; 
    x=x/y; 
    return 0; 
} 

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

回答

6

维基百科的文章回答:

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

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

您是否阅读过维基页面?它可能是一个FPE,但它不是浮点异常。

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

1

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

你得到信号的原因是因为二的方式补码的工作。 16位二进制补码的范围(例如)为-32768..32767

在换言之,65,536个可能值被映射到该范围。如果您尝试否定INT_MIN,则没有任何表示会给您正确的值(我们没有可用的32768)。

这是所有二进制补码的情况:八位给你-128..127,32位给你-2147483648..2147483647

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

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