Предположим, что оба числа являются целыми числами без знака. Если вы работаете со целыми числами со знаком, это будет немного сложнее, так как есть два способа переполнения: добавление двух больших положительных значений с добавлением двух больших отрицательных. В любом случае проверки старших значащих битов будет недостаточно, так как сложение передает бит переноса, вы должны принять это во внимание.
Для целых чисел без знака, если вы не хотите обманывать, есть простой способ:
(x+y < x) || (x+y < y)
Это будет работать, так как большинство компиляторов ничего не сделают, когда произойдет переполнение, просто позвольте этому быть.
Вы также можете заметить, что для переполнения, по крайней мере, для одного из двух чисел должен быть установлен самый старший бит, равный 1. Следовательно, что-то подобное должно работать (будьте осторожны, не проверено), но это гораздо более сложно, чем в другой версии .
/* both Most Significant bits are 1 */
(x&y&0x80000000)
/* x MSb is 1 and carry propagate */
||((x&0x80000000)&&(((x&0x7FFFFFFF)+y)&0x80000000))
/* y MSb is 1 and carry propagate */
||((y&0x80000000)&&(((y&0x7FFFFFFF)+x)&0x80000000))