clang emit a run time overflow on signed integer product in the cas of u...

...nsigned short.

this is a workaround and some added test to see if multiplies properly wraps for unsigned types

I am splitting my preceding pull request as advised by mathias
comment doesn't match what actually happens.
In C and C++, any type smaller than int is promoted to int before doing arithmetic.
The problem could very well happen with uint8_t, uint16_t or uint64_t, though in pratice int is usually 32-bit.