Это короче и, вероятно, быстрее.
int64_t GetDifference(uint64_t first, uint64_t second)
{
int64_t diff = first - second;
bool overflowed = (diff < 0) ^ (first < second);
assert(!overflowed);
return diff;
}
Хороший оптимизирующий компилятор должен заметить, что diff < 0
- это отрицательный флаг, а first < second
- это флаг переноса из предыдущего выражения.Сравнение этих двух флагов является классическим тестом на переполнение.
Даже если он этого не обнаруживает, требуется меньше операций.
Но самая большая причина, по которой я предпочитаю это, заключается в том, что нет магических чисел .