Переполнение со знаком не определено в C, а это для реального .
Одно из следующих решений:
signed_result = (unsigned int)one_argument + (unsigned int)other_argument;
Приведенное выше решение включает в себя поведение, определяемое реализацией вокончательное преобразование из unsigned
в int
, но не вызывать неопределенное поведение.Для большинства платформ компиляции, определяемых реализацией, результатом будет именно тот результат, который вы ожидаете получить.
Наконец, оптимизирующий компилятор для одной из многочисленных платформ, на которых выбор, определяемый реализацией, вынуждает компилятор дать вам ожидаемое поведение скомпилирует приведенный выше код в очевидную инструкцию сборки.
В качестве альтернативы, если вы используете gcc, то параметры -fwrapv
/ -fno-strict-overflow
могут быть именно тем, что вы хотите.Они предоставляют дополнительную гарантию в отношении стандарта, на который распространяются подписанные переполнения.Я не уверен в разнице между ними.