>>237657827 (OP) >>1896320 Приключения сибляди или как сложить int a + b
Как все уже поняли, недостаточно просто написать
sum = a + b;
Ведь при переполнении это UB.
Понятно, но наверное можно же проверить?
sum = a + b;
if(a + b > INT_MAX) error();
Стоп. Так же условие никогда не выполнится из-за переполнения.
Да и это уже целых 2 UB
sum = a + b;
if(sum < a) error();
Ну не, так не выйдет, ведь UB уже произошло, компилятор имеет право выкинуть всю проверку.
Ладно, шутки в сторону, давайте проверим заранее. Так, а что писать?
(a + b < INT_MAX) мы уже пробовали. (Ахаха, подловил. Надо писать не меньше, а меньше или равно) А, точно.
if(a <= INT_MAX - b)
sum = a + b;
else error();
Так, пагадите!
Что-то тут не так.
Допустим у нас a < 0 и b = 0
И мы только что (наберите воздуха в грудь), во время сравнения
Вычли с underflow.
Минус сколько-то минус макс_инт меньше чем влезает в инт.
Переполнение в другую сторону, тоже UB
Переписываем нахуй
if((b > 0 && a <= INT_MAX - b) ||
(b < 0 && a >= INT_MAX - b))
sum = a + b;
else error();
Скобочки посчитали? && и || не перепутали?
Вот теперь заебись!
И это сиблядь должна писать вместо каждого сложения в программе.
Ассемблерный выхлоп показывать не буду. Чтобы ночных кошмаров не было.