История изменений
Исправление bga_, (текущая версия) :
Я вообще такой код пишу не надеясь на всякие implicit conversion, integer promotion. Считаю что выражение имеет тип первого операнда (если он больше int). Если меньше то придется еще и кастануть. 
 
	uint64_t(x) + y; // будет uint64_t
	uint16_t(x) + y; // будет int
	uint16_t(x + y); // так точно будет uint16_t
Итого всегда явно кастуй.
Исходная версия bga_, :
Я вообще такой код пишу не надеясь на всякие implicit conversion, integer promotion. Считаю что выражение имеет тип первого операнда (если он больше int). Если меньше то придется еще и кастануть. 
 
	uint64_t(x) + y; // будет uint64_t
	uint16_t(x) + y; // будет int
	uint16_t(x + y); // так точно будет uint16_t