при условии двух произвольных временных отметок:
uint32_t timestamp1;
uint32_t timestamp2;
Существует ли стандартный способ соответствия для получения разницы между двумя знаками, кроме очевидных вариантов преобразования в больший тип со знаком и довольно многословного if-else.
Заранее неизвестно, какой из них больше, но известно, что разница не превышает максимум 20 бит, поэтому он уместится в 32-битную подпись.
int32_t difference = (int32_t)( (int64_t)timestamp1 - (int64_t)timestamp2 );
Этот вариант имеетнедостаток в том, что использование 64-битной арифметики может не поддерживаться аппаратным обеспечением и, конечно, возможно только при наличии более крупного типа (что, если временная метка уже 64-битная).
Другая версия
int32_t difference;
if (timestamp1 > timestamp2) {
difference = (int32_t)(timestamp1 - timestamp2);
} else {
difference = - ((int32_t)(timestamp2 - timestamp1));
}
является довольно многословным и включает условные переходы.
То есть с
int32_t difference = (int32_t)(timestamp1 - timestamp2);
Гарантируется ли это с точки зрения стандартов?