The multiplication operator * applies regular arithmetic conversions to its operands. These conversions convert unsigned char operands to int . See pmg answer for a standard link.
Obviously your int system type is wide enough to hold the result value of 65025 . On a system with a 16-bit int , where INT_MAX == 32767 , multiplication will overflow, causing undefined behavior (as a rule, the most significant bits of the result will be discarded). Most modern systems have a 32-bit int .
There is no multiplication operator for integer types narrower than int or unsigned int .
(Strictly speaking, it is possible that operands can be converted to unsigned int , but not to int . This will only happen if unsigned int can represent the entire range of unsigned char , but int cannot - and this cannot happen in the system with 8 bit char .)
source share