前言
力扣的过程中遇到的问题。这边简单总结一下。
解释
long num = a * b; 和 long num = (long) a * b; 这两行代码的语义和行为可能会有所不同,具体取决于变量 a 和 b 的类型。
-
当
a和b都是long类型时:long num = a * b;直接执行两个long类型的乘法操作,并将结果赋值给num。这是完全正确的。long num = (long) a * b;这里的(long) a是多余的,因为a已经是long类型了,但语法上仍然是合法的,并且结果仍然正确。
-
当
a和b都是int类型或可以隐式转换为int的类型时:long num = a * b;这里有一个潜在的问题,即a * b的结果首先会作为int类型进行计算(如果a和b都是int或可以隐式转换为int的较小类型)。如果结果超出了int类型的范围(即大于Integer.MAX_VALUE或小于Integer.MIN_VALUE),那么就会发生整数溢出,导致丢失信息。之后,这个可能溢出的int结果会被自动提升(也称为宽化转换)为long类型,但此时溢出已经发生,无法恢复。long num = (long) a * b;这里,(long) a将a转换为long类型,然后long类型的a与int类型的b相乘。在Java中,当一个操作数是long类型时,另一个操作数会被提升为long类型,然后再进行乘法操作。这样,结果就是一个long类型的值,可以容纳更大的范围,从而避免了整数溢出。
因此,当处理可能超出 int 范围的大整数时,推荐使用 long num = (long) a * b; 这种形式来确保不会发生整数溢出。而不要跟我一样傻傻地用long num = a * b;!!!