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?

4

3 回答 3

6

维基百科文章回答:

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

INT_MIN / -1 = -INT_MIN
             = INT_MAX + 1
             => invalid number
             => floating point exception (FPE)
于 2011-08-11T10:09:26.017 回答
1

你读过维基页面吗?它可能是 FPE,但它不是浮点异常。

尽管 SIGFPE 不一定涉及浮点运算,但在不破坏向后兼容性的情况下无法更改其名称。

于 2011-08-11T10:06:26.500 回答
1

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

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

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

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

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

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

于 2011-08-11T10:08:45.990 回答