#include <iostream>
#include <stdint.h>
#include <climits>

template <typename T>
class Num {
	public:
		inline Num (T src) : val (src) {}
		
		T val;
};

template <typename T>  Num<T> inline operator * (Num<T> a, Num<T> b) { return ( static_cast<T> (a.val * b.val) ); }
template <typename T>  Num<T> inline operator / (Num<T> a, Num<T> b) { return ( static_cast<T> (a.val / b.val) ); }
template <typename T>  Num<T> inline operator + (Num<T> a, Num<T> b) { return ( static_cast<T> (a.val + b.val) ); }
template <typename T>  Num<T> inline operator - (Num<T> a, Num<T> b) { return ( static_cast<T> (a.val - b.val) ); }
template <typename T>  Num<T> inline operator % (Num<T> a, Num<T> b) { return ( static_cast<T> (a.val % b.val) ); }

int main () {
	typedef Num<uint16_t> N16;
	typedef Num<uint32_t> N32;
	N16 res16 = (N16 ( 1000 ) * N16 ( 1000 )) / N16 ( 100 );
	N32 res32 = (N32 ( 1000 ) * N32 ( 1000 )) / N32 ( 100 );
	
	std::cout	<< "16bit Rechnung: " << res16.val << '\n'
				<< "32bit Rechnung: " << res32.val << '\n'
				<< "Diese Plattform hat "	<< (sizeof(int) * CHAR_BIT) << "bit \"int\", "
											<< (sizeof(long) * CHAR_BIT) << "bit \"long\", "
											<< (sizeof(void*) * CHAR_BIT) << "bit Adressraum.\n";
	
	return 0;
}