/* intof.h */
#pragma once
#include <stdbool.h>

typedef unsigned char int8;
typedef unsigned short int int16;
typedef unsigned int int32;

#define $1 (int8 *)
#define $2 (int16)
#define $4 (int32)
#define $i (int)
#define $c (char *)

#define add(x,y) _Generic((x), \
        int8:  add8, \
        int16: add16, \
        int32: add32 \
    )((x),(y))
#define sub(x,y) _Generic((x), \
        int8:  sub8, \
        int16: sub16, \
        int32: sub32 \
    )((x),(y))

int8 add8(int8,int8);
int16 add16(int16,int16);
int32 add32(int32,int32);

int8 sub8(int8,int8);
int16 sub16(int16,int16);
int32 sub32(int32,int32);

extern int16 *overflow;
bool overflowed(void);
