Я читал об этой функции:Почему x - y не переполняется для TMin в этой функции? Почему в этом случае функция неправильная?
int tadd_ok (int x, int y) {
int sum = x + y;
int negative_overflow = x < 0 && y < 0 && sum >= 0;
int positive_overflow = x >=0 && y >= 0 && sum < 0;
return !negative_overflow && !positive_overflow;
}
Этой функция имеет проблему, когда мы переходим в качестве аргумента для у Tmin (т.е. самых маленьких 2 дополнения).
В этом случае -y будет -y, когда передано в i.e все еще будет TMin, первое условие покажет, что мы имеем отрицательное переполнение для отрицательных значений x.
Затем я прочитал, что на самом деле «x - y не переполняется» в этих случаях.
Я понимаю, что проблема этой функции заключается в том, что она не учитывает угловой случай прохождения минимального отрицательного числа. Я вижу, что он вернет negative_overflow, который я не вижу/не понимаю, почему это неправильно.
Может ли кто-нибудь помочь мне понять это?
Проблема с этой функцией заключается в попытке обнаружить переполнение * после того, как оно могло произойти. Это неправильно, поскольку в случае переполнения носовые демоны уже имели место. – ouah
@ouah: Я думаю, что правильная функция пытается обнаружить до того, как это произойдет? Я не знаю, в чем разница этих подходов. Помимо этого ошибочного подхода, почему TMin считается не переполнением? – Cratylus
Проблема в том, что, как сказал ouah, компилятор C пытается вас навредить, а не помогать. Вместо того, чтобы подписывать переполнение целых чисел с использованием арифметики дополнений 2s, а затем позволяя вам проверять полученную сумму, многие компиляторы C предполагают, что oevrflow никогда не сможет помочь и оптимизировать вашу проверку переполнения. Для получения дополнительной информации см. [Этот вопрос] (http://stackoverflow.com/questions/3944505/detecting-signed-overflow-in-c-c) – hugomg