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