Как @EugeneSh.отмечает, что перенос равен 0 или 1. Более того, учитывая, что оба a
и b
имеют одинаковый тип без знака , их сумма четко определена, даже если арифметический результат превышает диапазон их типа,Более того, результат (C) суммы будет меньше, чем a
и b
, когда произойдет переполнение, и больше в противном случае, поэтому мы можем использовать тот факт, что реляционные операции C оцениваются либо в 0, либо в 1, чтобы выразить переносбит как
carry = (a + b) < a;
Это не требует каких-либо заголовков и не зависит от конкретной верхней границы или даже от a
и b
того же типа.Пока оба имеют неподписанные типы, он правильно сообщает о том, переполняет ли сумма более широкий из их типов или unsigned int
(в зависимости от того, что шире), что совпадает с их суммой, устанавливающей бит переноса.В качестве бонуса он выражается в терминах самой суммы, которая, я думаю, дает понять, что проверяется.