【问题标题】:Why can't results of arithmetic expressions including int and long variables be assigned back to int variable?为什么不能将包含 int 和 long 变量的算术表达式的结果分配回 int 变量?
【发布时间】:2018-03-01 13:50:36
【问题描述】:

我知道 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” - 类型 不是 int。表达式a * b 的类型是long。仅仅因为 you 可以看到这里的值并不意味着 Java 编译器将其视为 int 范围内的常量表达式。

标签: java casting integer int long-integer


【解决方案1】:

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

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

【讨论】:

  • 有道理。谢谢。
【解决方案2】:

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

如果您想将最终结果填回到 int 中,当然可以将其转换为 int 变量,但您确实面临结果可能不适合其中的风险。

【讨论】:

  • 感谢您的回复。我认为让我感到困惑的是默认情况下数字文字的类型为int,但是一旦我在表达式中使用我的long 变量a(上面的示例),它就会被视为long,即使我后面没有写“L”。由于将 a 声明为 long 变量,这是有道理的,但为什么首先默认将其值视为 int 呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多