Это должно работать для вычитания:
typedef u_int64_t bigNum[2];
void subtract(bigNum *a, u_int64_t b)
{
const u_int64_t borrow = b > a[1];
a[1] -= b;
a[0] -= borrow;
}
Сложение очень похоже.Вышесказанное, конечно, можно выразить и с помощью явного теста, но я считаю более чистым всегда брать кредиты.Оптимизация оставлена как упражнение.
Для bigNum
, равного { 0, 1 }
, вычитание двух сделало бы его равным { ~0UL, ~0UL }
, что является подходящим битовым шаблоном для представления -1.Здесь предполагается, что UL переводит целое число в 64 бита, что, конечно, зависит от компилятора.