在 Java 中,将 long 类型转换为 int 类型是一个常见的操作,但需要特别注意 数据范围 的问题,因为 long 的范围比 int 大得多,直接转换可能会导致 数据截断(溢出)。

(图片来源网络,侵删)
直接强制类型转换(最常用)
这是最直接的方法,使用 (int) 进行强制转换。long 的值超出了 int 的范围(即 Integer.MIN_VALUE 到 Integer.MAX_VALUE),高位会被截断,导致结果不正确。
long longValue = 123456789L; int intValue = (int) longValue; // 正常转换,因为 123456789 在 int 范围内 System.out.println(intValue); // 输出: 123456789 // 溢出示例 long bigLongValue = 2147483648L; // 这个值已经超过了 int 的最大值 (2147483647) int overflowedInt = (int) bigLongValue; System.out.println(overflowedInt); // 输出: -2147483648 (高位被截断,结果错误)
int 的范围:
- 最小值 (
Integer.MIN_VALUE): -2,147,483,648 (-2³¹) - 最大值 (
Integer.MAX_VALUE): 2,147,483,647 (2³¹ - 1)
long 的范围:
- 最小值 (
Long.MIN_VALUE): -9,223,372,036,854,775,808 (-2⁶³) - 最大值 (
Long.MAX_VALUE): 9,223,372,036,854,775,807 (2⁶³ - 1)
安全转换(推荐)
在实际开发中,你应该始终检查 long 的值是否在 int 的有效范围内,以避免意外的数据丢失,以下是几种安全转换的方法:

(图片来源网络,侵删)
使用 Math.toIntExact() (Java 8+)
这是最推荐的方法,因为它会自动检查转换是否会发生溢出,如果值超出 int 范围,它会抛出 ArithmeticException 异常,让你能立即发现问题。
long longValue = 1000L;
try {
int intValue = Math.toIntExact(longValue);
System.out.println("转换成功: " + intValue);
} catch (ArithmeticException e) {
System.out.println("转换失败: 数值超出 int 范围");
}
// 溢出示例
long overflowLong = Long.MAX_VALUE;
try {
int result = Math.toIntExact(overflowLong);
System.out.println(result);
} catch (ArithmeticException e) {
System.out.println("捕获到异常: " + e.getMessage()); // 输出: 捕获到异常: integer overflow
}
手动进行范围检查
如果你不想使用 Math.toIntExact() 或者需要在 Java 8 以下的版本中工作,可以手动检查范围。
long longValue = 1000L;
if (longValue >= Integer.MIN_VALUE && longValue <= Integer.MAX_VALUE) {
int intValue = (int) longValue;
System.out.println("转换成功: " + intValue);
} else {
System.out.println("转换失败: 数值超出 int 范围");
}
// 溢出示例
long overflowLong = 2147483648L;
if (overflowLong >= Integer.MIN_VALUE && overflowLong <= Integer.MAX_VALUE) {
int intValue = (int) overflowLong;
System.out.println("转换成功: " + intValue);
} else {
System.out.println("转换失败: 数值超出 int 范围"); // 会执行到这里
}
总结与最佳实践
| 方法 | 描述 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
(int) longValue |
强制类型转换 | 简单、直接 | 不安全,静默溢出,可能导致难以发现的 bug。 | 当你 100% 确定 long 的值在 int 范围内时(从数据库读取并已验证过)。 |
Math.toIntExact() |
Java 8+ 提供的精确转换方法 | 安全,溢出时会抛出异常,代码意图清晰。 | 需要 Java 8 或更高版本。 | 强烈推荐,适用于所有需要将 long 安全转为 int 的场景。 |
| 手动范围检查 | 先判断范围再转换 | 兼容性好,逻辑清晰。 | 代码稍显冗长。 | 在 Java 8 以下版本中,或者需要自定义溢出处理逻辑时。 |
核心建议:
除非你绝对确定数据不会溢出,否则永远不要直接使用
(int)进行转换。 优先选择Math.toIntExact(),因为它能帮你捕获潜在的错误,使你的代码更健壮、更安全。(图片来源网络,侵删)

