Целочисленного переполнения является канонический пример «неопределенного поведения» в C (отмечая, что операции с целыми целыми без знака никогда не переполняются, они определяются вместо обхода). Это означает, что после того, как вы выполнили x + y
, если он переполнен, вы уже были заняты. Слишком поздно делать какие-либо проверки - ваша программа, возможно, уже разбилась. Подумайте, как проверить деление на ноль - если вы подождете, пока после того, как деление будет выполнено, чтобы проверить, уже слишком поздно.
Таким образом, это означает, что метод (1) является единственным правильным способом его выполнения. Для max
вы можете использовать INT_MAX
от <limits.h>
.
Если x
и/или y
может быть отрицательным, тогда все сложнее - вам нужно выполнить тест таким образом, чтобы сам тест не мог вызвать переполнение.
if ((y > 0 && x > INT_MAX - y) ||
(y < 0 && x < INT_MIN - y))
{
/* Oh no, overflow */
}
else
{
sum = x + y;
}
На самом деле дубликат не дубликат вообще, это говорит о 'unsigned', которые четко определенный запах семантики, в то время как переполнение целого числа не определенно поведение в C. –
Там нет необходимости проверять и 'sum