这是维基百科的第二个例子SIGFPE 页。
#include <limits.h>
int main(void)
{
volatile int x=INT_MIN;
volatile int y=-1;
x=x/y;
return 0;
}
它正在将符号反转为INT_MIN的正数。怎么会是FPE?
答案 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允许的其他两种编码方案(一个补码和符号/幅度)在正值和负值之间具有直接的一对一映射。同样有趣,几乎没有人使用它们: - )