You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode竞赛代码中ret[(int) b[i]] = p;为何无溢出?

为什么ret[(int) b[i]] = p;不会发生溢出?

先看代码里b[i]的构造逻辑:

b[i] = (long) a[i] << 32 | i;

这行代码做了两个关键操作:

  • 把a[i]转为long后左移32位,这会把a[i]的内容放到long值的高32位,低32位全部补0。
  • 和原数组的索引i做按位或运算——i是int类型,取值范围是0到n-1(n是原数组长度),它的二进制仅占用低32位,所以按位或之后,b[i]的低32位就是原索引i的值,高32位则保留a[i]的信息。

当执行(int) b[i]强制类型转换时,Java会直接截取long值的低32位作为int结果,这部分刚好就是原本的索引i。而ret数组的长度是n,i的取值范围完全在ret数组的合法索引区间(0到n-1)内,所以作为数组索引使用时,既不会出现数值溢出,也不会触发数组越界异常。

内容的提问来源于stack exchange,提问作者Md Sajid Anwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 16:33:16