long long int 是什么?
long long int 是 C 语言中一种整数数据类型,它的主要特点是:

(图片来源网络,侵删)
- 范围大:它能表示的整数值范围比
int和long更广。 - 占用内存多:因为它要存储更大的数值,所以它占用的内存空间也更多。
在 C99 标准引入之前,它是一个扩展类型,并非所有编译器都支持,但从 C99 开始,long long int 正式成为 C 语言标准的一部分,所有现代 C 编译器(如 GCC, Clang, MSVC)都支持它。
基本特性
a. 大小和范围
long long int 的大小和范围取决于你的操作系统(32位还是64位)和编译器,但有一个保证的最小值。
- 大小:
sizeof(long long int)保证至少是 8 字节(64位),在绝大多数现代系统(无论是 Windows, Linux 还是 macOS 的 64位或 32位环境)上,它就是正好 8 字节。 - 范围:
- 有符号 (
signed long long int):- 最小值:
-9,223,372,036,854,775,808(即 -2⁶³) - 最大值:
9,223,372,036,854,775,807(即 2⁶³ - 1)
- 最小值:
- 无符号 (
unsigned long long int):- 最小值:
0 - 最大值:
18,446,744,073,709,551,615(即 2⁶⁴ - 1)
- 最小值:
- 有符号 (
b. long long vs. long long int
在 C 语言中,int 关键字在很多情况下是可选的。long long int 和 long long 完全等价,你可以根据个人喜好或代码风格选择使用哪一个。long long 更为简洁,是更常见的写法。
long long int a; long long b; // 这两种写法效果完全相同
c. 与 int 和 long 的比较
| 类型 | 大小 (典型值) | 有符号范围 (典型值) | 无符号范围 (典型值) |
|---|---|---|---|
int |
4 字节 | -2,147,483,648 到 2,147,483,647 | 0 到 4,294,967,295 |
long |
4 或 8 字节 (32位系统为4, 64位系统通常为8) | -2,147,483,648 到 2,147,483,647 或 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0 到 4,294,967,295 或 0 到 18,446,744,073,709,551,615 |
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 long的范围总是比int大。long的范围在不同系统上可能和int一样大(32位系统),也可能和long long一样大(64位系统),而long long的范围在所有标准兼容的系统上都是固定的、最大的。
如何使用 long long?
a. 声明变量
#include <stdio.h>
int main() {
// 声明一个有符号的 long long 变量
long long large_num = 12345678901234LL;
// 声明一个无符号的 long long 变量
unsigned long long very_large_num = 18446744073709551615ULL;
printf("The value of large_num is: %lld\n", large_num);
printf("The value of very_large_num is: %llu\n", very_large_num);
return 0;
}
b. 字面量后缀
为了告诉编译器一个整数字面量是 long long 类型,你需要在它后面加上后缀:
LL或ll:用于有符号long long。ULL或ull:用于无符号long long。
强烈建议使用大写的 LL 和 ULL,因为小写的 l 容易和数字 1 混淆,导致难以发现的错误。
long long a = 9999999999; // 错误!这个字面量默认是 int,可能会溢出 long long b = 9999999999LL; // 正确!明确指定为 long long 类型
c. printf 和 scanf 的格式说明符
当你使用 printf 或 scanf 等函数输入输出 long long 类型时,必须使用正确的格式说明符:
| 类型 | printf 格式说明符 |
scanf 格式说明符 |
|---|---|---|
signed long long |
%lld |
%lld |
unsigned long long |
%llu |
%llu |
示例:

(图片来源网络,侵删)
#include <stdio.h>
int main() {
long long my_num;
unsigned long long my_unum;
printf("Enter a signed long long number: ");
scanf("%lld", &my_num);
printf("Enter an unsigned long long number: ");
scanf("%llu", &my_unum);
printf("You entered signed: %lld\n", my_num);
printf("You entered unsigned: %llu\n", my_unum);
return 0;
}
一个常见的陷阱:整数溢出
long long 的范围很大,但不是无限的,当你计算的结果超出了它的表示范围时,就会发生整数溢出,这会导致结果“回绕”,得到一个无意义的值,并且不会产生任何警告。
示例:
#include <stdio.h>
int main() {
unsigned long long max_ull = 18446744073709551615ULL;
printf("Max ULL: %llu\n", max_ull);
// 加 1,会发生溢出
max_ull = max_ull + 1;
printf("After adding 1: %llu (it wrapped around to 0!)\n", max_ull);
signed long long max_sll = 9223372036854775807LL;
printf("Max SLL: %lld\n", max_sll);
// 加 1,会发生溢出
max_sll = max_sll + 1;
printf("After adding 1: %lld (it wrapped around to the most negative value!)\n", max_sll);
return 0;
}
输出:
Max ULL: 18446744073709551615
After adding 1: 0 (it wrapped around to 0!)
Max SLL: 9223372036854775807
After adding 1: -9223372036854775808 (it wrapped around to the most negative value!)
重要提示:整数溢出是 C 语言中一个常见的 Bug 来源,在进行大数运算时,务必小心检查是否可能发生溢出。
- 用途:当你需要处理可能超出
int或long范围的大整数时,使用long long。 - 大小:通常是 8 字节(64位),范围是
-2⁶³到2⁶³-1。 - 别名:
long long和long long int是一样的。 - 字面量:使用
LL或ULL后缀来声明long long类型的常量。 - I/O:
printf/scanf使用%lld和%llu。 - 风险:注意整数溢出问题,计算前要考虑结果的值是否会超出类型范围。
在 C++ 中,long long 同样被支持,并且推荐使用 <cstdint> 头文件中的 int64_t 和 uint64_t 等精确宽度整数类型,它们能更明确地保证类型的大小,但在纯 C 语言环境中,long long 是处理大整数最常用和最标准的方式。
