2011-08-11 84 views
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?

回答

6

維基百科的文章回答:

...觸發信號,因爲商,一個正數,是 不能表示。

INT_MIN/-1 = -INT_MIN 
      = INT_MAX + 1 
      => invalid number 
      => floating point exception (FPE) 
1

您是否閱讀過維基頁面?它可能是一個FPE,但它不是浮點異常。

雖然SIGFPE不一定涉及浮點運算 ,有沒有辦法改變它的名字不破壞 向後兼容性。

1

正如您所鏈接的頁面所指出的那樣,「儘管SIGFPE不一定涉及浮點運算,但如果不打破向後兼容性,則無法更改其名稱。

你得到信號的原因是因爲二的方式補碼的工作。 16位二進制補碼的範圍(例如)爲-32768..32767

在換言之,65,536個可能值被映射到該範圍。如果您嘗試否定INT_MIN,則沒有任何表示會給您正確的值(我們沒有可用的32768)。

這是所有二進制補碼的情況:八位給你-128..127,32位給你-2147483648..2147483647

在所有這些情況下,INT_MIN沒有一個積極的等價物。

有趣的是,由ISO C(一的補碼和符號/幅值)允許其它兩個編碼方案具有正值和負值之間的直接一個一對一映射)。同樣有趣的,幾乎沒有人使用它們:-)