long long int 是什么?
long long int 是 C 语言中的一种基本整数类型,它的核心特点是范围非常大,能够存储比普通的 int 或 long 类型大得多的整数值。

为了方便,我们通常可以简写为 long long,编译器会自动理解 long long 和 long long int 是同一种类型。
// 这两种声明方式是等价的 long long int my_number; long long my_number;
为什么需要 long long int?
想象一下,你需要存储一个人的银行账户余额,或者计算一个国家的国民生产总值,这些数字可能非常大,远远超过了普通 int 类型的表示范围。
- 一个
int类型通常是 32 位,最大只能表示约 21 亿。 - 如果一个公司的年收入超过 21 亿,用
int存储就会发生溢出,导致计算结果错误。
long long int 就是为了解决这个问题而设计的,它提供了足够大的范围来处理现实世界中的大整数。
关键特性:大小和范围
long long int 的特性由 C 标准规定,但具体实现(即它占多少字节)可能因编译器和操作系统(32位 vs 64位)而异,在现代系统上,它通常是标准化的。

标准规定
- C99 标准:首次将
long long引入标准,规定long long的最小范围是 -2⁶³ 到 2⁶³ - 1。 - C11 标准:沿用了 C99 的规定。
现代常见实现 (64位系统)
在绝大多数现代 64 位编译器和操作系统上(如 Linux, macOS, Windows 64位):
- 大小:
long long int通常占用 8 字节(64 位)。 - 有符号范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
- 用十六进制表示为:
0x8000000000000000到0x7FFFFFFFFFFFFFFF。 - 用科学计数法表示约为:-9.2 x 10¹⁸ 到 9.2 x 10¹⁸。
- 用十六进制表示为:
- 无符号范围:如果使用
unsigned long long,范围是 0 到 18,446,744,073,709,551,615 (即 2⁶⁴ - 1)。
与其他整数类型的比较
| 类型 | 常见大小 (字节) | 常见有符号范围 | 常见无符号范围 |
|---|---|---|---|
char |
1 | -128 到 127 | 0 到 255 |
short |
2 | -32,768 到 32,767 | 0 到 65,535 |
int |
4 | -2,147,483,648 到 2,147,483,647 | 0 到 4,294,967,295 |
long |
4 或 8 | 同 int 或同 long long |
同 unsigned int 或同 unsigned long long |
long long |
8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0 到 18,446,744,073,709,551,615 |
注意:
long的大小在不同系统上可能不同(在 64 位 Linux/macOS 上是 8 字节,但在 64 位 Windows 上仍然是 4 字节),而long long在现代系统上则稳定得多。
如何使用 long long int?
a) 声明变量
long long distance_to_star; // 有符号 unsigned long long file_size; // 无符号
b) 初始化变量
long long population = 7800000000LL; // 注意 LL 后缀 unsigned long long bytes_in_terabyte = 1099511627776ULL; // 注意 ULL 后缀
c) 字面量后缀
当你给 long long 或 unsigned long long 类型的变量赋一个整数值时,强烈建议使用后缀,以确保编译器正确理解这个数字的类型。
LL或ll:表示long long类型。ULL或ull:表示unsigned long long类型。
为什么需要后缀?
如果不加后缀,像 7800000000 这样的字面量,编译器可能会先尝试将其当作一个 int 或 long 来处理,如果这个数字超出了 int 或 long 的范围,就会发生编译警告或错误。

// 错误或警告的写法 (在32位系统上) // long long x = 2147483648; // 2147483648 超出了 int 的最大值 2147483647 // 正确的写法 long long x = 2147483648LL; // 编译器知道这是一个 long long 字面量
虽然现代 64 位编译器可能对 long long 更宽容,但养成使用后缀的好习惯可以避免很多潜在的跨平台问题。
d) 格式化输出 (printf)
要使用 printf 打印 long long 类型的变量,必须使用正确的格式说明符,否则会导致输出错误。
%lld:用于打印有符号的long long。%llu:用于打印无符号的unsigned long long。
示例代码:
#include <stdio.h>
int main() {
// 1. 声明和初始化
long long big_number = 123456789012345LL;
unsigned long long very_big_number = 18446744073709551615ULL;
// 2. 打印
// 注意:必须使用 %lld 和 %llu
printf("这是一个有符号的 long long: %lld\n", big_number);
printf("这是一个无符号的 unsigned long long: %llu\n", very_big_number);
// 3. 打印其范围边界
printf("long long 的最大值: %lld\n", 9223372036854775807LL);
printf("long long 的最小值: %lld\n", -9223372036854775808LL);
return 0;
}
输出:
这是一个有符号的 long long: 123456789012345
这是一个无符号的 unsigned long long: 18446744073709551615
long long 的最大值: 9223372036854775807
long long 的最小值: -9223372036854775808
重要注意事项
a) 溢出
即使 long long 的范围很大,它仍然不是无限的,如果你对它进行计算,结果超出了其表示范围,就会发生整数溢出。
- 对于有符号数,溢出是未定义行为,可能导致程序崩溃或产生一个完全错误的值。
- 对于无符号数,溢出是定义好的:它会“环绕”。
ULLONG_MAX + 1的结果会是0。
示例:
unsigned long long ull_max = 18446744073709551615ULL;
ull_max++; // 溢出,结果会变成 0
printf("溢出后的结果: %llu\n", ull_max); // 输出: 0
b) 算术运算
long long 可以参与所有标准的算术运算:, , , , ,只要参与运算的数都是 long long 类型,结果也会是 long long 类型。
long long a = 10000000000LL; long long b = 100LL; long long c = a * b; // c 的值是 1000000000000
c) 与其他类型的混合运算
当 long long 与较小的类型(如 int, char)混合运算时,较小的类型会被提升为 long long 类型,然后再进行计算,这通常能避免中间结果的溢出。
int small_num = 100; long long big_num = 10000000000LL; long long result = big_num * small_num; // small_num 会被临时提升为 long long
| 特性 | 描述 |
|---|---|
| 用途 | 存储非常大的整数,处理高精度计算。 |
| 大小 | 现代系统上通常是 8 字节 (64 位)。 |
| 范围 | 有符号:约 -9.2 x 10¹� 到 9.2 x 10¹⁸。 无符号:约 0 到 1.8 x 10¹⁹。 |
| 字面量后缀 | LL 或 ll (有符号),ULL 或 ull (无符号)。强烈推荐使用。 |
printf 格式 |
%lld (有符号),%llu (无符号)。必须使用。 |
| 核心优势 | 提供了远超 int 和 long 的数值范围,是现代 C 编程中处理大数事实上的标准。 |
掌握 long long int 是 C 语言编程中的一个重要里程碑,尤其是在算法、科学计算、金融或任何需要处理大数字的领域。
