Java中,long num = a * b和long num = (long) a * b的区别是什么?

82 阅读2分钟

前言

力扣的过程中遇到的问题。这边简单总结一下。

解释

long num = a * b;long num = (long) a * b; 这两行代码的语义和行为可能会有所不同,具体取决于变量 ab 的类型。

  1. ab 都是 long 类型时

    • long num = a * b; 直接执行两个 long 类型的乘法操作,并将结果赋值给 num。这是完全正确的。
    • long num = (long) a * b; 这里的 (long) a 是多余的,因为 a 已经是 long 类型了,但语法上仍然是合法的,并且结果仍然正确。
  2. ab 都是 int 类型或可以隐式转换为 int 的类型时

    • long num = a * b; 这里有一个潜在的问题,即 a * b 的结果首先会作为 int 类型进行计算(如果 ab 都是 int 或可以隐式转换为 int 的较小类型)。如果结果超出了 int 类型的范围(即大于 Integer.MAX_VALUE 或小于 Integer.MIN_VALUE),那么就会发生整数溢出,导致丢失信息。之后,这个可能溢出的 int 结果会被自动提升(也称为宽化转换)为 long 类型,但此时溢出已经发生,无法恢复。
    • long num = (long) a * b; 这里,(long) aa 转换为 long 类型,然后 long 类型的 aint 类型的 b 相乘。在Java中,当一个操作数是 long 类型时,另一个操作数会被提升为 long 类型,然后再进行乘法操作。这样,结果就是一个 long 类型的值,可以容纳更大的范围,从而避免了整数溢出。

因此,当处理可能超出 int 范围的大整数时,推荐使用 long num = (long) a * b; 这种形式来确保不会发生整数溢出。而不要跟我一样傻傻地用long num = a * b;!!!