在Java中,long
是一种基本数据类型,用于表示64位(8字节)有符号整数,取值范围为-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(即$-2^{63}$ 到 $2^{63}-1$),它适用于需要处理超大整数的场景(如时间戳、金融计算或大数据统计),以下是详细计算规则和注意事项:
声明与初始化
long a = 10000000000L; // 必须加后缀"L"(小写"l"易混淆,推荐大写) long b = 20; // 小范围整数可省略后缀 long c = a + b; // 计算结果:10000000020
基本运算规则
-
算术运算
支持加减乘除、取模等操作:long x = 5000000000L; long y = 2000000000L; System.out.println(x + y); // 7000000000 System.out.println(x - y); // 3000000000 System.out.println(x * y); // 10000000000000000000(可能溢出!) System.out.println(x / y); // 2(整除,舍去小数) System.out.println(x % y); // 1000000000(取余)
-
溢出问题
超出范围时会发生溢出(结果不报错,但值错误):long max = Long.MAX_VALUE; // 9,223,372,036,854,775,807 long overflow = max + 1; // 溢出为 -9,223,372,036,854,775,808
解决方案:使用
Math.addExact()
等安全方法(溢出时抛异常):long safeSum = Math.addExact(max, 1); // 抛出ArithmeticException
与其他类型的转换
-
自动转换(向上转型)
小范围类型(如int
)可直接赋值给long
:int num = 100; long bigNum = num; // 自动转为long
-
强制转换(向下转型)
大范围转小范围需显式强转,可能丢失精度:long bigVal = 9_223_372_036_854_775_807L; int smallVal = (int) bigVal; // 强制转换,结果为-1(数据截断)
-
与浮点型互转
long
转float
/double
自动完成,反向需强转(丢失小数):double d = 123456789.987; long l = (long) d; // 结果为123456789(小数部分丢弃)
常见应用场景
-
时间戳处理
long timestamp = System.currentTimeMillis(); // 毫秒级时间戳 long oneDayLater = timestamp + 24 * 60 * 60 * 1000; // 计算1天后
-
大数量统计
long globalUserCount = 15_000_000_000L; // 全球用户量统计
-
文件大小计算
long fileSizeBytes = 1024L * 1024 * 1024; // 1GB(避免int溢出)
关键注意事项
-
字面量必须加
L
后缀long val = 10000000000; // 编译错误!超出int范围 long correct = 10000000000L; // 正确
-
运算中的类型提升
若操作数包含更大类型(如double
),结果会提升:long a = 100L; double b = 2.5; double result = a * b; // 250.0(自动转为double)
-
避免混合类型计算错误
混合int
和long
时,int
会先提升为long
:int x = 2_000_000_000; int y = 1_500_000_000; long sum = x + y; // 错误!int相加溢出后转long(结果-6494967296) long correctSum = (long)x + y; // 正确:3500000000
- 适用场景:需处理超过20亿($2^{31}$)的整数或时间戳等大数字。
- 核心规则:字面量加
L
后缀、警惕溢出、注意运算中的类型提升。 - 安全建议:对关键计算使用
Math.addExact()
、Math.multiplyExact()
等防溢出方法。
引用说明:本文内容基于Oracle官方Java SE文档(Primitive Data Types)及Java语言规范(JLS 4.2.1),结合常见开发实践总结。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/26726.html