разница целого числа без знака - стандартный поддерживаемый способ получить подписанный результат?

при условии двух произвольных временных меток:

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);

Гарантируется ли это с точки зрения стандартов?

12
задан vlad_tepesch 2 July 2019 в 15:16
поделиться