Java中int到long的转换是自动拓宽转换,因int范围完全包含于long内,编译期完成、无精度损失;常见于赋值、字面量使用、混合算术及方法传参;需警惕运算溢出和数组类型不兼容问题。

Java 中 int 到 long 的转换是自动完成的,不需要写强制转换符号,因为 int(32 位)的数据范围完全落在 long(64 位)之内,编译器会在编译期直接做拓宽转换,不丢失精度、无异常风险、零运行开销。
什么时候会触发自动转换
以下几种常见场景下,int 会自动转为 long:
- 直接赋值:int i = 100; long l = i; —— 编译通过,l 值为 100L
- 字面量赋给 long 变量:long l = 42; —— 整数字面量默认是 int 类型,但会被自动提升为 long
- 算术表达式中混用:int a = 5; long b = a + 100L; —— a 自动转 long,整个加法按 long 运算
- 方法调用传参:void calc(long x) { ... }; calc(42); —— int 字面量或变量传入 long 参数时自动转换
为什么能自动转换
关键在于类型容量关系和 Java 规范设计:
- int 范围是 −2,147,483,648 到 2,147,483,647;long 范围是 −9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
- 每个 int 值在 long 中都有唯一、等价、无损的表示
- Java 明确规定:从较小范围整型到较大范围整型属于「拓宽转换」(widening conversion),编译器必须支持且不可拒绝
容易出错的地方
自动转换本身安全,但运算顺序可能掩盖问题:
- int a = Integer.MAX_VALUE; long b = a + 1; —— 看似没问题,实际先按 int 计算 a + 1,结果溢出为 Integer.MIN_VALUE(−2147483648),再转成 long,b 最终是 −2147483648L
- 正确写法是:long b = (long) a + 1; 或 long b = a + 1L;,确保加法在 long 范围内进行
- 数组或集合不支持自动转换:int[] arr = {1,2,3}; long[] copy = arr; 编译失败,必须逐元素赋值
和其他转换方式的区别
不要混淆自动转换与其它操作:
- Long.valueOf(i) 返回的是 Long 对象,不是基本类型转换,有装箱开销,仅在需要包装类时使用
- Long.parseLong("123") 是字符串解析,运行时操作,可能抛 NumberFormatException,和 int→long 的编译期转换无关
- 显式写 (long) i 虽然合法,但通常没必要;只在强调语义(如泛型边界、反射调用)或配合后缀(如 foo((long)i))时才建议用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











