Насчет кейловского printf не могу сказать, т.к. пользуюсь своим форматером Вот кусок отработки %d:
case 'd': /* Вывести параметр, как 2-ух байтное число */
limit = sizeof(int); fptr = (void*)(&va_arg(*ap, int));
goto FORMAT_PARAM;
Из него следует, что ести тип не int макрос va_arg отработает неправильно, поэтому следует указать явное приведение:
unsigned char packet[] = { 0xF0, 0x50 }; /* -4016 */
Не корректная отработка:
sprintf("r = %d", packet[0]);
Корректная отработка:
sprintf("r = %d", (int)packet[0]);
Возможно, если в кейловском printf сделать явное приведение к int переменной, все пройдет.