O resultado da multiplicação de dois inteiros positivos para longo é o valor negativo

Eu tenho código assim:

int a = 629339;
int b = 4096;
long res = a*b;

O resultado é-1717194752 mas se eu adicionar um elenco manual ao longolong res = ((long)a)*b; oulong res = (long) a*b; o resultado está correto2577772544 Quem pode explicar como isso funciona?

questionAnswers(3)

yourAnswerToTheQuestion