Когда вычисляется num1 * num2, он сохраняется в промежуточной переменной того же типа (то есть int), которая выглядит как мусор, потому что она недостаточно велика. Затем промежуточная переменная сохраняется в длинном int, но вычисленный ответ уже превратился в мусор.
Решение - привести один из аргументов умножения.
long int prod = (long int)num1 * num2;
Таким образом, промежуточные вычисления будут использовать больший из двух типов и временно хранить его как long int.