如何在Java中使用Java进行工作?

Cod*_*lue 28 java casting

这个问题不是关于如何将long正确地转换为int,而是当我们错误地将它转换为int时会发生什么.

所以考虑这个代码 -

   @Test
    public void longTest()
    {
        long longNumber = Long.MAX_VALUE;
        int intNumber = (int)longNumber; // potentially unsafe cast.
        System.out.println("longNumber = "+longNumber);
        System.out.println("intNumber = "+intNumber);
    }
Run Code Online (Sandbox Code Playgroud)

这给出了输出 -

longNumber = 9223372036854775807
intNumber = -1
Run Code Online (Sandbox Code Playgroud)

现在假设我做了以下更改 -

long longNumber = Long.MAX_VALUE - 50;
Run Code Online (Sandbox Code Playgroud)

然后我得到输出 -

longNumber = 9223372036854775757
intNumber = -51
Run Code Online (Sandbox Code Playgroud)

问题是,long的值如何转换为int?

Lou*_*man 38

低32位long被采取并放入int.

不过这是数学:

  1. 将负值long视为2^64加上该值.因此-1被视为2 ^ 64 - 1.(这是无符号的 64位值,它实际上是以二进制表示的值.)
  2. 取结果和mod 2 ^ 32.(这是无符号的 32位值.)
  3. 如果结果> = 2 ^ 31,则减去2 ^ 32.(这是带符号的32位值,即Java int.)

  • +1你可以做`(l&0xFFFFFFFFL)<< 32 >> 32`来得到没有强制转换的相同值. (2认同)