Java 中的 Long 到 int 的转换给出了不正确的结果

Long to int conversion in Java gives incorrect result

我正在尝试分离一个长数字的数字,以便它可以表示为整数数组 例如

12345......888     as [1,2,3,4,......8,8,8]

通常我用 n%10 来去掉最后一位数字,用 n/10 来减少数字,即

public static void main(String[] args) {
    long temp = 111111111111111110L;
    while(temp>0){
        System.out.println("----------");
        System.out.println(temp%10);
        System.out.println((int)temp%10);
        temp=temp/10;
    }
}

temp%10 给出了正确的结果。但它不能直接添加到 int 列表中。如果我尝试输入强制转换,它会在前几次迭代中给出不正确的结果。 输出

----------
0
-2
----------
1
9
----------
1
-5
----------
1
1
----------
1
9
----------
1
-3
----------
1
-5
----------
1
-7
----------
1
1
----------
1
1
----------
1
1
----------
1
1
----------
1
1
----------
1
1
----------
1
1
----------
1
1
----------
1
1
----------
1
1

我使用的解决方法是

int digitArray[] = new int[somenumber];
String s = Long.toString(n);
for(int i=0;i<s.length();i++){
    digitArray[i]=Integer.parseInt(""+s.charAt(i));
}

但我很好奇为什么当被类型转换的数字是个位数时类型转换无法以第一种方式工作,即在 long 范围内。

表达式评估规则导致此问题。

当你

(int)temp%10

实际上,大 longtemp 被转换为 int,导致 integer 溢出,

你的意思是

(int)(temp%10)