杰瑞科技汇

java long long 区别

核心区别一句话总结

在 Java 中,long 是一个固定 64 位的整数类型,而在 C/C++ 中,long long 是一个至少 64 位的整数类型,其具体大小可能因编译器和平台而异。

java long 区别-图1
(图片来源网络,侵删)

详细对比

特性 Java long C/C++ long long
标准定义 固定 64 位 (8 字节)。
在所有 Java 平台(JVM)上,大小和范围都完全一致。
至少 64 位
遵循 C++11/C99 标准,但实际大小由实现(编译器+平台)决定。
大小 永远是 64 位 通常为 64 位,但理论上可以更大(虽然极其罕见),在 32 位和 64 位的现代系统上,long long 几乎总是 64 位。
范围 固定范围
- 最小值: -2^63 (-9,223,372,036,854,775,808)
- 最大值: 2^63 - 1 (9,223,372,036,854,775,807)
通常范围
- 最小值: -2^63 (-9,223,372,036,854,775,808)
- 最大值: 2^63 - 1 (9,223,372,036,854,775,807)

注意:如果某个编译器决定让 long long 是 128 位,那么范围会大得多。
平台无关性 ,Java 的 "一次编写,到处运行" 哲学保证了 long 在所有平台上行为一致。 ,代码的可移植性较差,依赖于具体的编译器和目标平台。
语法 long myLong = 123456789L;
注意:字面量需要后缀 Ll(推荐大写 L,因为小写 l 容易与数字 1 混淆)。
long long myLongLong = 123456789LL;
注意:字面量需要后缀 LLll
对应类型 Java 没有与 C/C++ long 完全对应的类型,Java 的 int 是 32 位,long 是 64 位。 C/C++ 的 long 类型大小不确定(在 64 位 Linux/macOS 上是 64 位,在 64 位 Windows 上是 32 位)。long long 是为了提供一种标准化的、至少 64 位的类型。

深入解析

Java 的 long:平台无关的承诺

Java 的设计哲学之一就是平台无关性,为了实现这一点,Java 语言规范严格定义了所有基本类型的大小。

  • int 始终是 32 位。
  • long 始终是 64 位。

这意味着你在 Windows、Linux 或 macOS 上用 Java 编写的代码,只要 JVM 支持,long 的行为、范围和内存占用都是完全一样的,这极大地简化了跨平台开发,你不需要担心代码在 32 位或 64 位系统上表现不同。

public class LongExample {
    public static void main(String[] args) {
        long maxLong = 9223372036854775807L;
        long minLong = -9223372036854775808L;
        System.out.println("Size of long in bytes: " + Long.BYTES); // 输出 8
        System.out.println("Max value of long: " + Long.MAX_VALUE); // 输出 9223372036854775807
        System.out.println("Min value of long: " + Long.MIN_VALUE); // 输出 -9223372036854775808
    }
}

C/C++ 的 long long:为了兼容性和标准化而产生的类型

C/C++ 的设计更侧重于性能和硬件的紧密贴合,因此其基本类型的大小是“有条件的”。

  • 历史问题:在 C/C++ 的早期,long 类型的大小在不同系统上就存在差异,当 64 位计算时代来临时,需要一个比 long 更大的类型,但又不想破坏现有代码(因为将 long 从 32 位扩展到 64 位会破坏大量依赖其大小的代码)。
  • 解决方案long long 被引入,它被标准化为至少long 一样大,并且至少 64 位。
  • 现实情况:在现代编译器(如 GCC, Clang, MSVC)和现代操作系统上,long long 几乎无一例外地被实现为 64 位,在实际开发中,你可以认为 long long 64 位的,但从语言规范和理论上讲,它没有 Java 的 long 那么严格。
#include <iostream>
#include <climits> // 用于获取类型限制
int main() {
    long long maxLongLong = 9223372036854775807LL;
    long long minLongLong = -9223372036854775808LL;
    // 使用 sizeof 操作符检查大小
    std::cout << "Size of long long in bytes: " << sizeof(long long) << std::endl;
    std::cout << "Max value of long long: " << LLONG_MAX << std::endl;
    std::cout << "Min value of long long: " << LLONG_MIN << std::endl;
    return 0;
}

运行结果(在 x86-64 系统上)

java long 区别-图2
(图片来源网络,侵删)
Size of long long in bytes: 8
Max value of long long: 9223372036854775807
Min value of long long: -9223372036854775808

总结与建议

Java long C/C++ long long
固定、稳定、跨平台 灵活、依赖实现、通常64位
选择它当... 你在写 Java 代码,需要一个大整数时,直接用 long 你在写 C/C++ 代码,需要一个保证至少64位的大整数时,用 long long,而不是 long
移植性考量 不用考虑,Java 已经保证了。 如果你写的 C/C++ 代码需要在多个不同平台/编译器上编译,要意识到 long long 的大小理论上不是 100% 固定的,尽管实践中它几乎总是 64 位。

  • 如果你来自 Java 世界,你只需要记住 long 64 位的,没有其他选项。
  • 如果你来自 C/C++ 世界,你需要记住 Java 没有 long long,它的 long 就相当于 C/C++ 中 64 位的 long long,在 Java 中,long 的大小是契约,不是建议。
java long 区别-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇