3

これはウィキペディアのSIGFPE ページの 2 番目の例です。

#include <limits.h>
int main(void)
{
    volatile int x=INT_MIN;
    volatile int y=-1;
    x=x/y;
    return 0;
}

INT_MINの符号を正に反転しています。どうすれば FPE になれるのですか?

4

3 に答える 3

6

ウィキペディアの記事は次のように答えています。

... 正の数である商が表現できないため、信号をトリガーします。

INT_MIN / -1 = -INT_MIN
             = INT_MAX + 1
             => invalid number
             => floating point exception (FPE)
于 2011-08-11T10:09:26.017 に答える
1

リンク先のページが指摘しているように、「SIGFPE には必ずしも浮動小数点演算が含まれているわけではありませんが、下位互換性を損なうことなくその名前を変更する方法はありません」。

信号を受信して​​いる理由は、2 の補数が機能するためです。たとえば、16 ビットの 2 の補数の範囲は です-32768..32767

つまり、65,536 の可能な値がその範囲にマッピングされます。を否定しようとするINT_MINと、正しい値を与える表現はありません (32768利用できるものはありません)。

これはすべての 2 の補数に当てはまります。8 ビットで が得られ-128..127、32 ビットで が得られます-2147483648..2147483647

これらすべての場合においてINT_MIN、正の等価物はありません。

興味深いことに、ISO C で許可されている他の 2 つのエンコード方式 (1 の補数と符号/大きさ) には、正の値と負の値の間の直接的な 1 対 1 のマッピングがあります)。同様に興味深いことに、ほとんど誰もそれらを使用していません:-)

于 2011-08-11T10:08:45.990 に答える
1

ウィキのページは読みましたか?FPE かもしれませんが、浮動小数点の例外ではありません。

SIGFPE は必ずしも浮動小数点演算を伴うわけではありませんが、下位互換性を損なうことなくその名前を変更する方法はありません。

于 2011-08-11T10:06:26.500 に答える