#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 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;
}
