Генерация арифметического переполнения - PullRequest
1 голос
/ 15 мая 2019

Почему эти два значения дают нулевой результат. Я думал, что это должно генерировать арифметическое переполнение, но действуя как a и b, имеют противоположные знаки.

#include <stdio.h>
// trying to generate an arithmetic overflow
int sum(int a, int b) {
    return a + b;
}
int main()
{
    int a=2147483648;
    int b=2147483648;
    printf("%d", sum(a,b));
    return 0;
}

1 Ответ

1 голос
/ 15 мая 2019

Для вашего конкретного компилятора на вашем компьютере;вполне вероятно, что int a=2147483648; по существу совпадает с int a=INT_MAX+1;, который обрабатывается как int a=INT_MIN;, и так же для int b, и что это приводит к return INT_MIN+INT_MIN;, что на самом деле похоже на "0x80000000 + 0x80000000 = 0x100000000 = 0x00000000 сoverflow ".

Однако все вышеперечисленное опирается на неопределенное поведение (при условии, что неопределенное поведение на практике случайно вызывает перенос).

В общем;Вы хотите использовать unsigned int (или даже лучше, uint32_t), чтобы избежать неопределенного поведения и получить «ожидаемое переполнение», на которое вы надеялись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...