这个问题不是关于long should be correctly cast to an 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);
    }

这给出了输出-
longNumber = 9223372036854775807
intNumber = -1

现在假设我进行以下更改-
long longNumber = Long.MAX_VALUE - 50;

然后我得到输出-
longNumber = 9223372036854775757
intNumber = -51

问题是,将long的值转换为int的吗?

最佳答案

取出long的低32位并将其放入int中。

不过,这是数学:

  • 将负的long值视为2^64加该值。因此-1被视为2 ^ 64-1。(这是无符号的64位值,这是该值实际以二进制形式表示的方式。)
  • 将结果和mod乘2 ^ 32。 (这是无符号的32位值。)
  • 如果结果> = 2 ^ 31,则减去2 ^ 32。 (这是带符号的32位值Java int。)
  • 10-06 11:21