Почему это генерирующее исключение с плавающей точкой? - PullRequest
3 голосов
/ 11 августа 2011

Это второй пример википедии SIGFPE page.

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

Инвертирует знак в положительное значение INT_MIN.Как это может быть FPE?

Ответы [ 3 ]

6 голосов
/ 11 августа 2011

Ответы статьи Wikipedia:

... запускает сигнал, потому что частное, положительное число, не представимо.

INT_MIN / -1 = -INT_MIN
             = INT_MAX + 1
             => invalid number
             => floating point exception (FPE)
1 голос
/ 11 августа 2011

Как указывает та страница, на которую вы ссылаетесь, «хотя SIGFPE не обязательно включает в себя арифметику с плавающей точкой, невозможно изменить ее имя без нарушения обратной совместимости».

Причина, по которой вы получаетесигнал из-за способа, которым работают числа дополнения двух.Диапазон для числа дополнения шестнадцати битов (например) составляет -32768..32767.

Другими словами, 65 536 возможных значений отображаются в этом диапазоне.Если вы попытаетесь опровергнуть INT_MIN, нет представления, которое даст вам правильное значение (у нас нет 32768 доступного для нас).

Это относится ко всем двум дополнительным числам: восемь битов дают вам -128..127, тридцать два бита дают вам -2147483648..2147483647.

Во всех этих случаях INT_MIN не имеет положительного эквивалента.

Интересно, что два другихСхемы кодирования, допускаемые ISO C (дополнение и знак / величина), имеют прямое взаимно-однозначное соответствие между положительными и отрицательными значениями).Не менее интересно, их почти никто не использует: -)

1 голос
/ 11 августа 2011

Вы читали страницу вики? Это может быть FPE, но это не исключение с плавающей запятой.

Хотя SIGFPE не обязательно использует плавающую точку арифметика, нет способа изменить его имя без взлома обратная совместимость.

...