Eh, sorry it was a typo. I wonder why I typed uint anyway.
Your variable a holds a negative value and you're casting it to an unsigned integer. Unsigned variables cannot hold negative values. And yes, it is technically enough to cast just a or b, because the other operands will be promoted automatically.
int16_t cc = (int32_t)aa * bb / (pe->fade_out); // This works.