這是維基百科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(一的補碼和符號/幅值)允許其它兩個編碼方案具有正值和負值之間的直接一個一對一映射)。同樣有趣的,幾乎沒有人使用它們:-)