为什么强制转换为int给我8而不是0?

时间:2020-07-23 06:35:58

标签: java types casting int long-integer

很抱歉,如果这很简单。这已经使我困惑了一段时间。在以下代码中:

public class Main {
    public static void main(String[] args) {
        long a = 10000000000L;
        System.out.println(a % 10);
    }
}

我得到的输出为0,这是我期望的。但是当我这样转换为int时,

public class Main {
        public static void main(String[] args) {
            long a = 10000000000L;
            System.out.println((int)a % 10);
        }
}

我得到8而不是0。我不知道发生了什么。为什么强制转换后0变成8?

2 个答案:

答案 0 :(得分:3)

之所以会这样,是因为首先将a的值强制转换为int,然后再执行该模块。

您想要做的是:

public class Main {
        public static void main(String[] args) {
            long a = 10000000000L;
            System.out.println((int)(a % 10));
        }
}

答案 1 :(得分:3)

long投射到int时。并且long的值超出了int (-2,147,483,648到2,147,483,647)的范围。因此,当您尝试将其强制转换并存储在int数据类型中时,JVM会将其舍入到int数据类型范围内。并且将存储在int中的值为 141006540​​8

现在,如果您执行141006540​​8%10 = 8。

您可以尝试下面的程序进行验证。

public class Test {
    public static void main(String[] args) {
        long a = 10000000000L;
        int b = (int) a; 
        System.out.println(b);  // here it will print 1410065408 
        System.out.println(b % 10);  //so here it's 8
    }
}