为什么这会产生浮点异常?

时间:2011-08-11 10:03:56

标签: c floating-point-exceptions

这是维基百科的第二个例子SIGFPE 页。

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

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

3 个答案:

答案 0 :(得分:6)

维基百科的文章回答:

  

...触发信号,因为商,正数,是   不可代表。

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

答案 1 :(得分:1)

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

  

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

答案 2 :(得分:1)

当你链接到那个页面时,“尽管SIGFPE不一定涉及浮点运算,但是没有办法在不破坏向后兼容性的情况下更改其名称”。

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

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

所有两个补码的情况都是如此:8位给你-128..127,32位给你-2147483648..2147483647

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

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