int到long赋值

时间:2014-07-15 10:17:55

标签: java int long-integer

我一直在尝试这种int和long转换,我尝试将int变量分配给long变量。代码如下:

public static void main(String []args){
    int i = 1024;
    long j = i;
    long k = i*i*i*i;
    System.out.println("j= " +j+ ", k= " +k);
}

因此,在打印j时,它只输出1024。但是在打印k时,它显示溢出(k = 0)。我使用这种技术解决了这个问题,我已经明确地将每个i转换为long。即。

public static void main(String []args){
    int i = 1024;
    long j = i;
    long k = ((long)i)*((long)i)*((long)i)*((long)i);
    System.out.println("j= " +j+ ", k= " +k);
}

现在,它显示了jk的正确值。 所以,我想知道为什么需要在第二种情况下转换int而不是在第一种情况下转换klong {{1}},在此繁重的任务之后,可以保留此值。但是,为什么没有正确分配?

5 个答案:

答案 0 :(得分:19)

原因是你的行

long k = i*i*i*i;

可以被认为是

long k = ((i*i)*i)*i;

...或

int k1 = i*i;
int k2 = k1*i;
int k3 = k2*i;
long k = k3;

因此,当kn中的任何一个溢出时,您会收到错误。

当你进行演员表演时,你总是将long放在一起,从而避免出现这个问题。

当然,对您的初始计划进行最简单的修改就是将i直接定义为long,而不是int

long i = 1024L;

答案 1 :(得分:7)

这个问题是基于不同类型使用不同内存量的事实。 int和long都是Integers,区别在于 int是4个字节,而长是8个字节

让我们稍微修改你的代码:

public class Test {


  public static void main(String []args){
        int i = 1024;
        long j = i;
        long k = i*i*i;

        System.out.println("My multipliers are of type int:");
        System.out.println("j= " +j+ ", k= " +k);           
        System.out.println("Is k less than Integer.MAX_VALUE: "  + (k < Integer.MAX_VALUE? "YES" : "NO"));
        k = i*i*i*i;
        System.out.println("j= " +j+ ", k= " +k);

        //now multiplying with j instead of i
        System.out.println("\nNow Im working with a long type:");
        k = j*j*j;
        System.out.println("j= " +j+ ", k= " +k);           
        System.out.println("Is k less than Integer.MAX_VALUE: "  + (k < Integer.MAX_VALUE? "YES" : "NO"));
        k = j*j*j*j;
        System.out.println("j= " +j+ ", k= " +k);
        System.out.println("Is k less than Integer.MAX_VALUE: "  + (k < Integer.MAX_VALUE? "YES" : "NO"));
        k = j*j*j*j;

     }

}

上面的代码显示,当你乘以i 3次时,结果是一个小于Integer.MAX_VALUE(即2147483647)的值,当你将它乘以4次时,结果是0,因为没有足够的地方在4个字节的乘数中。 :) 但是你可以看到,当乘数(右侧,j)是long类型时,打印正确的值,并且最后的打印显示语句k&lt; Integer.MAX_VALUE为false,这是零的原因。 :)

答案 2 :(得分:6)

i*i*i*i是一个全int乘法,因此结果只是整数(在你的情况下溢出)。对于长期结果,您只需要将其中一个转换为long,这样就足够了

long k = ((long)i)*i*i*i;

答案 3 :(得分:2)

首先,i的值是一个int,整数乘法发生,i*i*i*i结果是整数,因此integer overflow.

在第二种情况下,您明确告诉/使结果为long

答案 4 :(得分:2)

1099511627776乘法的结果是>Integer.MAX_VALUE,因为它是整数乘法,所以在i*i*i值为1073741824之后,但在乘以{{1}之后它超出了范围,导致integer overflow,k将为0。

  • 您可以将其中一个1024投射到i
  • long1L)相乘,但不是1L*i*i*i*i
  • 您也可以将i*i*i*i*1L指定为长{+ 1}},然后将i*i*i与此i
  • 相乘