这种情况会不会溢出

问题描述 投票:0回答:1

我想知道为什么我运行这段代码时没有错误,尤其是这一行

ret[(int) b[i]] = p;
。其实这个解决方案是我在leetcode竞赛387中找到的,排名第3的用户。

public int[] shrink(int[] a) {
  int n = a.length;
  long[] b = new long[n];
  for (int i = 0; i < n; i++) b[i] = (long) a[i] << 32 | i;
  Arrays.sort(b);
  int[] ret = new int[n];
  int p = 0;
  for (int i = 0; i < n; i++) {
    if (i > 0 && (b[i] ^ b[i - 1]) >> 32 != 0) p++;
    ret[(int) b[i]] = p;
  }
  return ret;
}

解释一下这一行

ret[(int) b[i]] = p;
为什么没有溢出。

arrays integer overflow long-integer shrink
1个回答
0
投票

根据§5.1.3。缩小原始转换:

有符号整数到整型 T 的窄化转换会简单地丢弃除 n 个最低位之外的所有位,其中 n 是用于表示类型 T 的位数。

该方法使用 long 来表示两个整数,并将

long
转换为
int
将检索最低有效 32 位(这是原始数组中的索引)。投射不会导致溢出。

© www.soinside.com 2019 - 2024. All rights reserved.