>Интересно, а почему не сделали набор таких функций и не включили в
>стандартную библиотеку - вещь то очень нужная. Что-то типа этого:
>int safe_add_uint32( uint32_t val1, uint32_t val2, uint32_t* result );
Я решил сделать себе ряд таких функций. Для uint32_t и uint64_t все заработало прекрасно, и я ободренный этим, решил сделать также функции для uint8_t и uint16_t. Каково же было мое удивление и недоумение, когда эти функции незаработали!
Расследование выявило, что компилятор (gcc (GCC) 3.3.4) как-то странно рожает код для оператора if: вместо того, чтобы использовать cmpb или cmpw (для uint16_t), он использовал cmpl, и в результате функция не работает. Помогло приведение типов. Вот рабочий код:
//-------------------------------------------------------------------
// Безопасное сложение двух чисел с контролем переполнения
// val1 - первое число
// val2 - второе число
// res - указатель на переменную, в которую будет записан
// результат. В случае, если было зафиксированно переполнение,
// эта переменная останется в неизменном виде.
// Возвращаемое значение: 1 в случае успеха, 0 при переполнении
int safe_add_uint8( uint8_t val1, uint8_t val2, uint8_t* res )
{
int result = 0;
if( (uint8_t)val1 <= (uint8_t)~val2 )
{
*res = val1 + val2;
result = 1;
}
return result;
}
//-------------------------------------------------------------------