#include <stdio.h>
#include <stdint.h>
typedef union {uint16_t u; int16_t s;} container16;
typedef union {uint32_t u; int32_t s;} container32;
int32_t mul(uint16_t x, uint16_t y) {
container16 x1, y1;
container32 z1;
x1.u = x;
y1.u = y;
z1.s = x1.s * y1.s + (1uL<<16)*(y1.s*(x1.s<0)+x1.s*(y1.s<0));
return z1.u;
}
int main() {
printf("3 * 4 = %d\n", mul
(3, 4)); printf("30000 * 4 = %d\n", mul
(30000, 4)); printf("3 * 40000 = %d\n", mul
(3, 40000)); printf("40000 * 40000 = %d\n", mul
(40000, 40000)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KCnR5cGVkZWYgdW5pb24ge3VpbnQxNl90IHU7IGludDE2X3Qgczt9IGNvbnRhaW5lcjE2Owp0eXBlZGVmIHVuaW9uIHt1aW50MzJfdCB1OyBpbnQzMl90IHM7fSBjb250YWluZXIzMjsKCmludDMyX3QgbXVsKHVpbnQxNl90IHgsIHVpbnQxNl90IHkpIHsKICAgIGNvbnRhaW5lcjE2IHgxLCB5MTsKICAgIGNvbnRhaW5lcjMyIHoxOwogICAgeDEudSA9IHg7CiAgICB5MS51ID0geTsKICAgIHoxLnMgPSB4MS5zICogeTEucyArICgxdUw8PDE2KSooeTEucyooeDEuczwwKSt4MS5zKih5MS5zPDApKTsKICAgIHJldHVybiB6MS51Owp9CgppbnQgbWFpbigpIHsKICAgIHByaW50ZigiMyAqIDQgPSAlZFxuIiwgbXVsKDMsIDQpKTsKICAgIHByaW50ZigiMzAwMDAgKiA0ID0gJWRcbiIsIG11bCgzMDAwMCwgNCkpOwogICAgcHJpbnRmKCIzICogNDAwMDAgPSAlZFxuIiwgbXVsKDMsIDQwMDAwKSk7CiAgICBwcmludGYoIjQwMDAwICogNDAwMDAgPSAlZFxuIiwgbXVsKDQwMDAwLCA0MDAwMCkpOwogICAgcmV0dXJuIDA7Cn0K