Во первых - разрядность типа int зависит от среды прграммирования, она может быть любой от 8-ми бит и далее до бескончности

Если ты хочешь работать с 16-ти битными числами (я так понял ты знак определяешь по старшему биту), то указывай конкретную разрядность short - 16-битное целое.
Во вторых помножив на PR1 ты вылетишь за разрядную сетку. Да и в любом случае максимальный коэффициент у тебя 2, что обеспечивает вылет из разрядной сетки даже при промежуточном расширении разрядности.
Приведение знака у тебя неправильное. Во первых такое приведение корректно только если сначала знаковое привести к беззнаковому, во вторых нужно вычитать из 0, а не из 0xFFFF.
#define VOL_MAX 100
static int volume(short dat_in, short PR1)
{
if (PR1 > VOL_MAX)
PR1 = VOL_MAX;
dat_in = ((long)dat_in * PR1) / VOL_MAX;
return dat_in;
}