Ваш результат содержит отрицательные числа, потому что код неправильно реализует арифметику по модулю 10. В таких строках:
dif[k] = (num1[i] - num2[j] - carry) % 10;
Если вычитание num1[i] - num2[j] - carry
меньше 0, вы хотите сохранить результат 10-вычитания. Есть языки, в которых оператор %
работает так же, как в, но в C он возвращает отрицательное число, поэтому -1 % 10
дает -1, а не 9.
Чтобы исправить проблему, код должен быть более явным, например ::
int sub = num1[i] - num2[j] - carry;
if (sub >= 0) {
dif[k] = sub;
carry = 0;
} else {
dif[k] = 10 - sub;
carry = 1;
}