Java中long类型如何正确计算

Java中,long类型用于64位整数计算,直接使用算术运算符(+、-、*、/、%)进行加减乘除和取模运算,注意数值后加L/l后缀(如100L),避免int溢出,与int混合运算时,int自动提升为long。

Java中,long是一种基本数据类型,用于表示64位(8字节)有符号整数,取值范围为-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(即$-2^{63}$ 到 $2^{63}-1$),它适用于需要处理超大整数的场景(如时间戳、金融计算或大数据统计),以下是详细计算规则和注意事项:

Java中long类型如何正确计算


声明与初始化

long a = 10000000000L;  // 必须加后缀"L"(小写"l"易混淆,推荐大写)
long b = 20;            // 小范围整数可省略后缀
long c = a + b;         // 计算结果:10000000020

基本运算规则

  1. 算术运算
    支持加减乘除、取模等操作:

    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(取余)
  2. 溢出问题
    超出范围时会发生溢出(结果不报错,但值错误):

    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

与其他类型的转换

  1. 自动转换(向上转型)
    小范围类型(如int)可直接赋值给long

    int num = 100;
    long bigNum = num; // 自动转为long
  2. 强制转换(向下转型)
    大范围转小范围需显式强转,可能丢失精度:

    Java中long类型如何正确计算

    long bigVal = 9_223_372_036_854_775_807L;
    int smallVal = (int) bigVal; // 强制转换,结果为-1(数据截断)
  3. 与浮点型互转
    longfloat/double自动完成,反向需强转(丢失小数):

    double d = 123456789.987;
    long l = (long) d; // 结果为123456789(小数部分丢弃)

常见应用场景

  1. 时间戳处理

    long timestamp = System.currentTimeMillis(); // 毫秒级时间戳
    long oneDayLater = timestamp + 24 * 60 * 60 * 1000; // 计算1天后
  2. 大数量统计

    long globalUserCount = 15_000_000_000L; // 全球用户量统计
  3. 文件大小计算

    long fileSizeBytes = 1024L * 1024 * 1024; // 1GB(避免int溢出)

关键注意事项

  1. 字面量必须加L后缀

    Java中long类型如何正确计算

    long val = 10000000000; // 编译错误!超出int范围
    long correct = 10000000000L; // 正确
  2. 运算中的类型提升
    若操作数包含更大类型(如double),结果会提升:

    long a = 100L;
    double b = 2.5;
    double result = a * b; // 250.0(自动转为double)
  3. 避免混合类型计算错误
    混合intlong时,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

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月16日 15:41
下一篇 2025年6月16日 15:42

相关推荐

  • Java如何操作bat文件

    编写bat文件执行Java程序:使用文本编辑器创建bat脚本,包含java -jar 程序.jar或java 主类名命令,双击bat即可运行Java应用,简化命令行操作。

    2025年6月10日
    000
  • Java如何创建正则表达式?

    在Java中创建正则表达式通常使用java.util.regex.Pattern类,通过Pattern.compile()方法编译正则字符串生成Pattern对象,再结合Matcher类进行匹配操作,Pattern pattern = Pattern.compile(“a*b”);,注意字符串中的反斜杠需转义为\\。

    2025年6月4日
    100
  • 黑莓手机如何安装java应用?

    黑莓手机安装Java程序(.jad/.jar文件)通常需将文件放入设备存储,通过自带文件管理器找到并点击.jad文件执行安装(部分型号需开启“允许未知来源”权限)。

    2025年6月12日
    000
  • Java如何判断字符串不相等

    在Java中判断字符串内容不相等,应使用equals()方法配合逻辑非运算符:if (!str1.equals(str2)) { … },避免用==(仅比较引用地址),需注意处理null值以防空指针异常,推荐使用Objects.equals()可安全处理null。

    2025年6月7日
    200
  • Java怎样读取图片文件的内容?

    Java可以通过ImageIO.read()方法读取图片文件,转换为BufferedImage对象,进而获取像素数据、尺寸等信息,或使用ImageIO配合InputStream处理网络/资源图片。

    2025年5月30日
    300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN