核心概念:它是什么?
long long int(通常简写为 long long)是 C 语言中一种有符号整数类型。

long long: 表示它的范围“很长很长”。int: 表明它本质上是一个整数类型。- 有符号: 意味着它可以表示正数、负数和零。
大小和范围
long long int 的关键特性是其能够存储的数值范围。
- 大小: 在现代的 32 位和 64 位系统上(如 Windows, Linux, macOS),
long long int通常占用 64 位(8 字节)的内存空间。 - 范围: 由于是有符号类型,64 位中最高位(第 63 位)用作符号位(0 表示正,1 表示负)。
- 最大值:
2⁶³ - 1,即 9,223,372,036,854,775,807。 - 最小值:
-2⁶³,即 -9,223,372,036,854,775,808。
- 最大值:
如何确认?
你可以使用 <limits.h> 头文件中定义的宏来获取你系统上 long long 的确切范围:
#include <stdio.h>
#include <limits.h>
int main() {
printf("Size of long long int: %zu bytes\n", sizeof(long long int));
printf("Minimum value of long long int: %lld\n", LLONG_MIN);
printf("Maximum value of long long int: %lld\n", LLONG_MAX);
return 0;
}
输出示例(在 64 位系统上):
Size of long long int: 8 bytes
Minimum value of long long int: -9223372036854775808
Maximum value of long long int: 9223372036854775807
注意:

sizeof(long long int)返回的是size_t类型,所以使用%zu格式化。LLONG_MIN和LLONG_MAX是long long类型的最小/最大值常量。- 同样还有
ULLONG_MAX用于表示unsigned long long的最大值。
为什么需要 long long int?
C 语言提供了多种整数类型(int, short, long, long long),它们的尺寸取决于具体的编译器和操作系统。long long 的引入主要是为了解决一个问题:
当 long 类型不够用时怎么办?
在 64 位系统出现之前,许多系统上的 long 也是 32 位的(范围约 ±21亿),如果需要进行大数计算,比如计算文件总大小(TB 级别)、天文数字、或者 64 位时间戳,32 位的 int 或 long 就会溢出。
经典案例:时间戳

在 Unix 和类 Unix 系统中,时间戳(自 1970 年 1 月 1 日以来的秒数)最初用 time_t 类型表示,在 32 位系统上,time_t 通常就是 int 或 long,这意味着它将在 2038 年 1 月 19 日达到其最大值,导致“2038年问题”(Y2038 problem)。
为了解决这个问题,现代系统(特别是 64 位系统)将 time_t 定义为 long long 或 long,使其能够安全地表示到公元 292,277,026,596 年。
long long 与 long 的区别
这是一个常见且重要的问题。
| 特性 | long long int |
long int |
|---|---|---|
| C标准引入 | C99 | C89 (ANSI C) |
| 保证最小尺寸 | 64 位 (8 字节) | 32 位 (4 字节) |
| 典型系统尺寸 | 64 位 (8 字节) | 32 位 (4 字节) 或 64 位 (8 字节) |
| 可移植性 | 高,在所有符合 C99 及以上标准的编译器上,尺寸和范围都是确定的。 | 较低,尺寸依赖于平台,在 Windows (x86) 上是 4 字节,在 Linux/macOS (x86-64) 上是 8 字节。 |
- 如果你需要一个固定的大整数范围,并且你的代码需要高度可移植,请使用
long long。 - 如果你只是需要比
int大的数,并且不关心平台差异,可以使用long。 - 在现代 64 位系统上,
long和long long通常是相同的尺寸,但long long的语义更明确。
使用示例
基本赋值和打印
#include <stdio.h>
int main() {
long long big_num = 123456789012345LL; // 注意 LL 后缀
long long neg_big_num = -987654321098765LL;
printf("The big positive number is: %lld\n", big_num);
printf("The big negative number is: %lld\n", neg_big_num);
return 0;
}
关键点:在给 long long 类型的变量赋值时,如果字面量很大,最好在末尾加上 LL 或 ll 后缀,这告诉编译器这是一个 long long 常量,避免潜在的截断。
计算大数阶乘
#include <stdio.h>
int main() {
long long factorial = 1;
int n = 20; // 20! 已经远超 int 的范围
for (int i = 1; i <= n; ++i) {
factorial *= i;
}
printf("%d! = %lld\n", n, factorial);
return 0;
}
输出:
20! = 2432902008176640000
如果这里使用 int 类型,结果会溢出,得到一个完全错误的负数。
unsigned long long int
与 long long int 对应的是无符号版本 unsigned long long int(或 unsigned long long)。
- 大小: 同样是 64 位。
- 范围:
0到2⁶⁴ - 1(即18,446,744,073,709,551,615)。 - 用途: 当你确定数值不会是负数,并且需要表示更大的正数时使用。
#include <stdio.h>
#include <limits.h>
int main() {
unsigned long long max_ull = ULLONG_MAX;
printf("Maximum value of unsigned long long: %llu\n", max_ull);
return 0;
}
| 特性 | 描述 |
|---|---|
| 类型 | 有符号 64 位整数 |
| 标准 | C99 及以后 |
| 大小 | 通常是 8 字节 |
| 范围 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
| 优点 | 范围巨大,可移植性好,是处理大整数和 64 位时间戳的标准选择 |
| 格式化符 | printf / scanf 使用 %lld |
| 字面量后缀 | LL 或 ll |
在 C 语言中,当你需要处理可能超出 int 甚至 long 范围的整数时,long long int 是你的首选,它提供了一个强大、标准且可移植的解决方案。
