#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <inttypes.h>

typedef unsigned __int128 uint128_t;

void store_uprod(uint128_t *dest, uint64_t x, uint64_t y)
{
    *dest = x * (uint128_t) y;
}

void print_uint128(uint128_t n)
{
    if (n == 0) {
      return;
    }

    print_uint128(n/10);
    putchar(n%10+0x30);
}

int main()
{
    uint64_t x = 2000000000000; // 2 trillion
    uint64_t y = 3000000000000; // 3 trillion

    uint128_t z;
    store_uprod(&z,x,y);

    printf("Max long:\n%lu\n",ULONG_MAX);
    printf("Result:\n");
    print_uint128(z);
    printf("\n");
    return 0;
}
