Причина в том, что второй вызов метода вычисляется в значение, не влезающее в тип данных long. То есть возникает классический integer overflow. В java и php старшие биты, не поместившиеся в long, просто отбрасываются. В python и ruby на уровне языка поддерживается bignum арифметика, поэтому результат другой. То есть числа могут быть сколь угодно велики без опасности возникновения переполнения. В php такое тоже возможно при помощи модуля bcmath или gmp. В java аналогичную арифметику предоставляет класс BigInteger:
import java.math.BigInteger;
public class A {
public static void main(String[] args) {
BigInteger output_1 = generate(400732734464L, -74, 12);
BigInteger output_2 = generate(1641401281110016L, 100, 14);
System.out.println(output_1);
System.out.println(output_2);
}
public static BigInteger generate(long val1, int val2, int val3) {
return BigInteger.valueOf(val2 & 255)
.add(BigInteger.valueOf(val1))
.shiftLeft(val3);
}
}