为什么包含int和long变量的算术表达式的结果不能赋值回int变量?

Why can't results of arithmetic expressions including int and long variables be assigned back to int variable?

我知道 Java 中的数字文字默认为 int 类型。 所以下面例子中的 5 实际上是一个 int 只要我不在它后面写一个 'L' 。那么,如果 5 和 7 都是 int 类型,为什么我不能将 a*b 的结果赋值回 int 变量呢?

long a = 5;
int b = 7;
int c = a * b;

我不明白为什么 Java 看到这样的东西会遇到问题,只要:

long a = 345236577970;

但如果表达式包含 long 变量,即使其类型实际上是 int,仍会执行类型转换。超级基础的初学者问题,抱歉。

在计算完成之前,无法知道结果会是什么(这似乎很明显,但有时需要大声说出来)。它可能是适合 int 的结果,但也可能不是——它可能是 long。因此,该语言旨在要求结果的类型可以适应最大可能的结果范围。

如果您想将最终结果填回 int,您当然可以将其转换为 int 变量,但您确实要承担结果可能不正确的风险适合那里。

您的推理是将 5 和 7(均为 int)分配给变量,然后将其相乘,因此结果应该是 int。这种推理的缺陷在于您的代码不是将 5 和 7 相乘,而是 ab。一旦将常量分配给这些变量,常量的类型是什么就无关紧要了:唯一重要的是变量的类型。在这种情况下,类型是 longint 所以结果是 long.

转换为 int 的简单选项是强制转换或使用 Math.toIntExact