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