这是维基百科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不一定涉及浮点运算,但如果不打破向后兼容性,则无法更改其名称。
你得到信号的原因是因为二的方式补码的工作。 16位二进制补码的范围(例如)为-32768..32767
。
在换言之,65,536个可能值被映射到该范围。如果您尝试否定INT_MIN
,则没有任何表示会给您正确的值(我们没有可用的32768
)。
这是所有二进制补码的情况:八位给你-128..127
,32位给你-2147483648..2147483647
。
在所有这些情况下,INT_MIN
没有一个积极的等价物。
有趣的是,由ISO C(一的补码和符号/幅值)允许其它两个编码方案具有正值和负值之间的直接一个一对一映射)。同样有趣的,几乎没有人使用它们:-)