Шестнадцатеричное число 0xfb869e
равно , а не отрицательно. Встроенные функции преобразования чисел не будут преобразовывать его в отрицательное значение, поскольку его значение положительное.
То, что вы говорите, это то, что это шестнадцатеричный эквивалент без знака 24-битного дополнения до 2s отрицательного числа, и вам нужно это число. Чтобы получить его, нужно преобразовать его в положительное число, а затем использовать вычисления, чтобы преобразовать его в 24-битный эквивалент дополнения 2s:
char *buf = "fb869e";
long n;
n = strtol(buf, NULL, 16);
if (n > 0x7fffffL)
n -= 0x1000000L;