The instruction set contains a MOVSX/MOVSXD for sign extensions and MOVZX (no MOVZXD) MOVSX can move a word (short) to a quadword (long long) with sign extension. To move unsigned short (word) to a quadword (unsigned long long) with zero extension, this will require 2 instructions a zero extended move of short to long (dword), followed by a zero extended move of dword to qword.
C/C++ will promote the unsigned short c (regardless of cast) prior to multiplication (which will be 64 bits x 64 bits). If you examine the dissassembly window you will see the two instructions.
If you know that c is always in the range of 0:32767 then you can use the signed format.
The performance issue will likely reside with how you get the values into a, b, c