为什么将一个非常大的 long 数转换为 int 会给我们一个奇怪的输出(Java)?

nri*_*ilk 0 java casting long-integer

我正在用 Java 练习一些转换,但我遇到了一种情况,在任何地方都找不到任何答案。有很多类似的问题和答案,但没有一个给我这个特殊案例的解释。

当我做类似的事情时

    long l = 165787121844687L;
    int i = (int) l;

    System.out.println("long: " + l);
    System.out.println("after casting to int: " + i);
Run Code Online (Sandbox Code Playgroud)

输出是

long: 165787121844687
after casting to int: 1384219087
Run Code Online (Sandbox Code Playgroud)

这个结果对我来说非常有趣。

我知道long类型是64位整数,int类型是32位整数。我还知道,当我们将较大的类型转换为较小的类型时,我们可能会丢失信息。我知道有一个Math.toIntExact()方法非常有用。

但是这个“ 1384219087 ”输出的解释是什么?数据丢失了,但为什么是这个数字呢?“ 165787121844687 ”怎么变成了“ 1384219087 ”?为什么代码甚至可以编译?

就是这样。谢谢!

Old*_*mer 7

十六进制表示法的 165787121844687L = 0000 96C8 5281 81CF

\n

十六进制表示法中的 1384219087 = 5281 81CF

\n

因此,转换按预期截断了前 32 位。

\n
                        32-bits \n                        deleted \n                       \xe2\x96\xbc\xe2\x96\xbc\xe2\x96\xbc\xe2\x96\xbc \xe2\x96\xbc\xe2\x96\xbc\xe2\x96\xbc\xe2\x96\xbc\n165_787_121_844_687L = 0000 96C8 5281 81CF  \xe2\x9e\xa3  1_384_219_087\n    64-bit long                  \xe2\x96\xb2\xe2\x96\xb2\xe2\x96\xb2\xe2\x96\xb2 \xe2\x96\xb2\xe2\x96\xb2\xe2\x96\xb2\xe2\x96\xb2      32-bit int \n          \xc2\xa0                      \xc2\xa032-bits \n                                 remaining\n
Run Code Online (Sandbox Code Playgroud)\n