これはウィキペディアの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 になれるのですか?
これはウィキペディアの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 になれるのですか?
ウィキペディアの記事は次のように答えています。
... 正の数である商が表現できないため、信号をトリガーします。
INT_MIN / -1 = -INT_MIN
= INT_MAX + 1
=> invalid number
=> floating point exception (FPE)
リンク先のページが指摘しているように、「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 のマッピングがあります)。同様に興味深いことに、ほとんど誰もそれらを使用していません:-)
ウィキのページは読みましたか?FPE かもしれませんが、浮動小数点の例外ではありません。
SIGFPE は必ずしも浮動小数点演算を伴うわけではありませんが、下位互換性を損なうことなくその名前を変更する方法はありません。