我一直在尝试这种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);
}
现在,它显示了j
和k
的正确值。
所以,我想知道为什么需要在第二种情况下转换int
而不是在第一种情况下转换k
。 long
{{1}},在此繁重的任务之后,可以保留此值。但是,为什么没有正确分配?
答案 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
long
(1L
)相乘,但不是1L*i*i*i*i
i*i*i*i*1L
指定为长{+ 1}},然后将i*i*i
与此i