Вы должны использовать va_arg, чтобы получить фактическое значение аргумента. Va_start является только инициализацией переменной arg. Arg на самом деле является указателем на значение в стеке, а не сам по себе.
Следующая строка возвращает фактическое значение:
int myvalue = va_arg(arg,int);
Обратите внимание, что я получаю целое число, а не короткое, поскольку короткие автоматически переводятся в int компилятором C.
РЕДАКТИРОВАТЬ: Uli ответ также является правильным. Если вы хотите передать несколько значений в printf, вы должны вызвать vprintf вместо printf (и тогда вызывать va_arg не нужно, поскольку в этом случае вы не знаете точные типы аргументов).