Вот как вы можете это сделать:
uint32 addui(uint32 position, int32 offset, int* overflow)
{
*overflow = (((offset >= 0) && (0xFFFFFFFFu - position < (uint32)offset)) ||
((offset < 0) && (position < (uint32)-offset)));
return position + offset;
}
Суффикс u должен гарантировать, что константа 0xFFFFFFFF имеет тип без знака (шестнадцатеричные константы без суффиксов могут быть со знаком или без знака, в зависимости от значения и того, каккомпилятор определяет int, long и long long), и поэтому выражение слева от <не имеет знака.Возможно, в этом нет необходимости, но я немного устал, чтобы понять, если это не так.Это точно не повредит. </p>
(uint32) приведёт к закрытию компилятора, который может подумать, что мы делаем что-то глупое (сравнение подписанного с неподписанным).
ОБНОВЛЕНИЕ : Если int32 имеет представление дополнения 2 и смещение = -0x80000000, выражение -offset
может вызывать сигнал, определяемый реализацией, или даже вызывать неопределенное поведение в соответствии со стандартом C (см. Разделы 6.3.1.3 Signed and unsigned integers
и 7.20.6.1 The abs, labs and llabs functions
из C99), но практически этого никогда не происходит, потому что на большинстве платформ отрицание реализовано в виде простой инструкции (или нескольких), которая не вызывает никаких исключений / прерываний / прерываний / событий в ЦП и мало что дает для генерации дополнительныхкод для проверки этого крайнего случая, тем более что целые числа представлены в коде дополнения 2, а абсолютное значение -0x80000000 равно 0x80000000, что может быть удобно (например, для расчета абсолютного значения).Процессор не заботится о целых числах со знаком и даже использует одинаковые инструкции сложения и вычитания для обоих (это преимущество дополнения 2), и он редко заботится о целочисленных переполнениях, потому что они обычно происходят в программном обеспечении и являются способомжизнь.Знайте об этом, но не волнуйтесь.
Пожалуйста, посмотрите, как они реализованы в Microsoft SafeInt для C ++ ( Код , Intro , На MSDN , Видео ) и IntSafe для C ( Intro + Code , На MSDN ).