Я читал об этой функции:
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;
}
У этой функции есть проблема, когда мы передаем в качестве аргумента для y TMin (т.е. наименьшее дополнение 2).
В этом случае -y будет -y при передаче, т.е. все еще будет TMin первое условие покажет, что у нас есть отрицательный переполнение для значений x, которые являются отрицательными.
Затем я прочитал, что на самом деле "x - y не переполняется" в этих случаях.
Насколько я понимаю, проблема этой функции в том, что она не учитывает угловой случай передачи минимального отрицательного числа. Я вижу, что он вернет отрицательное_переполнение. Я не вижу/не понимаю, почему это неправильно.
Может ли кто-нибудь помочь мне понять это?
INT_MIN
, я не совсем понимаю ваш вопрос, поскольку вы никогда не вычисляете-y
вtadd_ok
. - person ouah   schedule 22.09.2014tadd_ok(x, -y);
, чтобы проверить, не переполнится лиx - y
. Проблема заключается в передаваемом аргументе, т.е. в том, как он называется - person Cratylus   schedule 22.09.2014tadd_ok
, если вы делаете что-то вроде-INT_MIN
(обратите внимание на-
), вы уже вызываете неопределенное поведение, и внутри функцииtadd_ok
вы мало что можете сделать. - person ouah   schedule 22.09.2014-INT_MIN
- это-INT_MIN
. Он зацикливается из-за асимметрии. По какой-то причине я думаю, что цель этого примера кода - показать, чтоINT_MIN
на самом деле не может вызвать переполнение. Но я не понимаю, почему - person Cratylus   schedule 22.09.2014-INT_MIN
не выполняет перенос, он вызывает неопределенное поведение. Переполнение целого числа со знаком вызывает неопределенное поведение. - person ouah   schedule 22.09.2014gcc
превратил конечный цикл в бесконечный цикл из-за переполнения со знаком в вопросе Почему это цикл выдает «предупреждение: итерация 3u вызывает неопределенное поведение» и выводит более 4 строк? - person Shafik Yaghmour   schedule 22.09.2014