29

这个问题不是关于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);
    }

这给出了输出 -

longNumber = 9223372036854775807
intNumber = -1

现在假设我进行以下更改-

long longNumber = Long.MAX_VALUE - 50;

然后我得到输出 -

longNumber = 9223372036854775757
intNumber = -51

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

4

1 回答 1

40

的低 32 位long被取出并放入int.

不过,这是数学:

  1. 将负值long视为2^64加上该值。所以-1被视为 2^64 - 1。(这是无符号的64 位值,它是该值实际以二进制表示的方式。)
  2. Take the result and mod by 2^32. (This is the unsigned 32-bit value.)
  3. If the result is >= 2^31, subtract 2^32. (This is the signed 32-bit value, the Java int.)
于 2012-09-19T19:13:46.780 回答