归入长赋值

2022-09-03 09:36:21

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

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);
}

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

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);
}

现在,它显示了 和 的正确值。所以,我想知道为什么在第二种情况下需要这个,而不是在第一个案例中。,则可以在此繁重的赋值之后保留此值。但是,为什么没有正确分配它?jkintklong


答案 1

原因是你的线

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

当你做你的演员时,你显然是通过总是将s相乘来规避这个问题。long

当然,对初始程序最简单的修改是直接定义为,而不是 .ilongint

long i = 1024L;

答案 2

这个问题是基于不同的类型使用不同的内存量的事实。int 和 long 都是 Integer,不同之处在于 int 是 4 个字节,而 long 是 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)的类型很长时,打印正确的值,并且最后一次打印显示语句k< Integer.MAX_VALUE是假的,这就是你的零的原因。:)


推荐