这是维基百科SIGFPE 页面的第二个示例。
#include <limits.h>
int main(void)
{
volatile int x=INT_MIN;
volatile int y=-1;
x=x/y;
return 0;
}
它将符号反转为 INT_MIN 的正数。怎么可能是FPE?
这是维基百科SIGFPE 页面的第二个示例。
#include <limits.h>
int main(void)
{
volatile int x=INT_MIN;
volatile int y=-1;
x=x/y;
return 0;
}
它将符号反转为 INT_MIN 的正数。怎么可能是FPE?
维基百科文章回答:
... 触发信号,因为商,一个正数,是不可表示的。
INT_MIN / -1 = -INT_MIN
= INT_MAX + 1
=> invalid number
=> floating point exception (FPE)
你读过维基页面吗?它可能是 FPE,但它不是浮点异常。
尽管 SIGFPE 不一定涉及浮点运算,但在不破坏向后兼容性的情况下无法更改其名称。
正如您链接到的页面所指出的那样,“尽管 SIGFPE 不一定涉及浮点运算,但在不破坏向后兼容性的情况下无法更改其名称”。
您收到信号的原因是因为二进制补码的工作方式。十六位二进制补码的范围(例如)是-32768..32767
.
换言之,65,536 个可能的值映射到该范围。如果您尝试否定INT_MIN
,则没有任何表示可以为您提供正确的值(我们没有32768
可用的值)。
这是所有二进制补码数的情况:八位给你-128..127
,三十二位给你-2147483648..2147483647
。
在所有这些情况下,INT_MIN
没有积极的等价物。
有趣的是,ISO C 允许的其他两种编码方案(一个补码和符号/幅度)在正值和负值之间具有直接的一对一映射)。同样有趣的是,几乎没有人使用它们 :-)