【问题标题】:int(primitive) value not getting typecasted to long(primitive) implicitlyint(primitive) 值没有被隐式转换为 long(primitive)
【发布时间】:2015-06-24 20:32:48
【问题描述】:

我的问题看起来很简单。

int i =99999;
long square = i*i;
System.out.println(square);   //prints 1409865409 - incorrect value

int i = 99999;
long square = (long) i*i;
System.out.println(square);  // prints 9999800001 - correct value

看起来是 int 的范围问题。 但是它不应该将产品类型转换为 long 隐式吗? 我在这里想念什么? 我知道如何使用 Math.pow(double,double) 函数并且它运行良好。但 我想知道上面输出的原因。

TIA。

【问题讨论】:

  • i * i 始终是 int,无论您是否将其分配给 long
  • “但它不应该隐式地将产品类型转换为 long 吗?” 是的,就是这样。 产品将扩大到long,而不是因素

标签: java int long-integer


【解决方案1】:

在第一种情况下,结果首先计算为int,然后才转换为long

因此结果错误。


在第二种情况下,i 在计算结果之前转换为long,因为(long)(转换为long)的优先级高于*

因此是正确的结果。

【讨论】:

    【解决方案2】:

    您已成为运算符优先级错误的牺牲品。这一行:

    long square = (long) i*i;
    

    其实是这样的:

    long square = ((long) i)*i;
    

    这很重要,因为当您将 99999 相乘时,您会得到一个太大而无法表示为 int 的数字。这一行:

    long square = i*i;
    

    平方i,导致溢出错误,然后将结果转换为long,并将其分配给square。另一行将第一个因子转换为 long,强制它在计算之前将第二个因子也转换为 long

    【讨论】:

      猜你喜欢
      • 2020-09-05
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      相关资源
      最近更新 更多