| 特性 | int |
long |
|---|---|---|
| 目的 | 整数类型,作为系统的“默认”整数类型。 | 整数类型,通常保证比 int 有更大的范围。 |
| 大小 | 不固定,通常为 16 位或 32 位。 | 不固定,通常为 32 位或 64 位。 |
| 范围 | -32,768 到 32,767 (16位) 或 -2,147,483,648 到 2,147,483,647 (32位) |
-2,147,483,648 到 2,147,483,647 (32位) 或 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 (64位) |
| 关键点 | 速度最快,优先使用。 | 范围更大,当 int 不够用时使用。 |
| 可移植性 | 差,其大小依赖于编译器和平台。 | 较好,现代系统上通常是 32 或 64 位。 |
int (Integer)
int 是 C 语言中最基本、最常用的整数类型。

(图片来源网络,侵删)
大小和范围
int 的大小(占用的字节数)是不固定的,它取决于你所使用的编译器和目标系统(操作系统和硬件架构)。
-
在大多数现代 32 位和 64 位系统上(如 Windows, Linux, macOS):
sizeof(int)通常是 4 字节 (32 位)。- 它的范围是
-2,147,483,648到2,147,483,647(即-2³¹到2³¹ - 1)。
-
在一些非常老的 16 位系统上(如早期的 MS-DOS):
sizeof(int)可能是 2 字节 (16 位)。- 它的范围是
-32,768到32,767(即-2¹⁵到2¹⁵ - 1)。
何时使用 int?
- 默认选择:当你需要一个整数变量,且没有特殊要求时,
int是你的首选,因为它是为当前系统优化的,通常运算速度最快。 - 循环计数器:
for循环中的计数器几乎总是用int。 - 数组索引:数组的索引也几乎总是用
int。
示例:

(图片来源网络,侵删)
#include <stdio.h>
int main() {
int counter = 0;
int sum = 0;
for (counter = 0; counter < 100; ++counter) {
sum += counter;
}
printf("Sum is: %d\n", sum); // %d 是 int 的格式化输出
printf("Size of int is: %zu bytes\n", sizeof(int)); // 输出 4 (在64位系统上)
return 0;
}
long (Long Integer)
long 是另一种整数类型,它的设计初衷是为了提供比 int 更大的数值范围。
大小和范围
和 int 一样,long 的大小也是不固定的,但它通常比 int 大。
-
在 32 位系统上:
sizeof(long)通常是 4 字节 (32 位),和int一样大。- 范围也是
-2,147,483,648到2,147,483,647。
-
在 64 位系统上 (主流现状):
(图片来源网络,侵删)sizeof(long)通常是 8 字节 (64 位)。- 范围是
-9,223,372,036,854,775,808到9,223,372,036,854,775,807(即-2⁶³到2⁶³ - 1)。
何时使用 long?
- 数值可能超出
int范围时:如果你需要处理的数字可能超过int的最大值(计算文件大小、内存地址、大型数据库ID等),就应该使用long。 - 需要更大的范围时:明确知道你需要一个更大的数值范围。
示例:
#include <stdio.h>
int main() {
long large_number = 123456789012L; // 注意 L 后缀,表示这是一个 long 常量
printf("The large number is: %ld\n", large_number); // %ld 是 long 的格式化输出
printf("Size of long is: %zu bytes\n", sizeof(long)); // 输出 8 (在64位系统上)
return 0;
}
关键区别与选择指南
区别总结
| 区别点 | int |
long |
|---|---|---|
| 大小 | 平台相关 (通常是 32 位) | 平台相关 (通常是 64 位) |
| 范围 | 较小 | 较大 |
| 性能 | 通常最快 | 和 int 相同或略慢 |
| 可移植性 | 较差,大小不固定 | 较好,现代系统上大小趋同 |
如何选择?黄金法则
- 优先使用
int:除非有明确的理由不使用它,否则int是你的最佳选择,它是 C 语言的“自然”整数类型,性能最好。 - 如果数值可能超出
int的范围,请使用long:这是一个基于对数值范围的预判,如果你不确定,或者数值增长很快(比如累加操作),使用long更安全。 - 不要依赖
int和long的大小:永远不要写这样的代码:// 错误示例!这在64位系统上会溢出 int big_num = 2000000000; big_num = big_num * big_num;
也不要假设
long一定比int大(虽然在现代系统上几乎总是这样)。
扩展:long long 和 <stdint.h>
为了解决整数大小不固定带来的可移植性问题,C99 标准引入了两个重要的解决方案。
long long
long long 是一个保证比 long 更大的类型,在所有现代系统上,它都是 8 字节 (64 位)。
- 大小:至少 8 字节。
- 范围:至少
-9,223,372,036,854,775,808到9,223,372,036,854,775,807。 - 常量后缀:
LL或ll(9000000000000000000LL)。
当你需要绝对的 64 位整数时,应该使用 long long。
<stdint.h> (可移植整数类型)
这是解决可移植性问题的最佳实践,这个头文件定义了一系列具有明确大小的整数类型,它们在任何符合标准的编译器上大小都一样。
int32_t: 一个正好 32 位的有符号整数。int64_t: 一个正好 64 位的有符号整数。uint32_t: 一个正好 32 位的无符号整数。uint8_t: 一个正好 8 位的无符号整数 (也就是char)。
示例:
#include <stdio.h>
#include <stdint.h> // 引入这个头文件
int main() {
// 如果你需要一个精确的 32 位整数,而不是依赖平台的 "int"
int32_t my_counter = 100;
printf("32-bit counter: %d\n", my_counter);
// 如果你需要一个精确的 64 位整数
int64_t file_size = 15000000000LL;
printf("File size: %lld\n", file_size);
return 0;
}
总结与最佳实践
int: 默认、最快、用于常规任务(循环、索引)。long: 用于可能超出int范围的大数,在现代 64 位系统上,它通常是 64 位的。long long: 当你明确需要 64 位整数时使用,保证跨平台一致性。<stdint.h>: 最佳实践,当你需要特定大小的整数(如 32 位、64 位)以确保代码的可移植性时,总是优先使用int32_t,int64_t等类型。- 永远不要假设大小:不要写
if (sizeof(long) > sizeof(int))这样的代码,如果需要,使用<stdint.h>中的类型。
