vak: (Default)
[personal profile] vak
Сложить два целых числа, вернуть целое. Породить исключение в случае арифметического переполнения.
int add(int a, int b);
Удивительно, сколько народу обламывается на этой задачке.

Date: 2020-08-02 18:38 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
int add(int a, int b) {
    if (~(a ^ b) & (a ^ ((a & ~INT_MIN) + (b & ~INT_MIN))) & INT_MIN)
        throw overflow_error("arithmetic overflow");
    return a + b;
}

Date: 2020-08-02 21:05 (UTC)
From: [personal profile] ex0_planet
А здесь закладываемся на арифметику, построенную на дополнении до двух. Это пофиксили только в C2x (будущий стандарт).