Целочисленное переполнение является каноническим примером «неопределенного поведения» в 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;
}