这是一个在C语言学习中非常经典且重要的问题,因为它们的区别涉及到数据大小和平台(操作系统和编译器)的依赖性。

一句话总结:int 的大小由编译器决定,通常与机器的字长(如32位或64位)匹配;而 long 的大小理论上至少和 int 一样大,但在现代64位系统上,它通常是64位的,比32位的 int 更大。
大小(Size)
这是两者最核心、最本质的区别。
| 数据类型 | 大小(在32位系统上) | 大小(在64位系统上) |
|---|---|---|
int |
4 字节 (32位) | 4 字节 (32位) |
long |
4 字节 (32位) | 8 字节 (64位) |
关键点解读:
int的稳定性:int的大小在不同系统上出奇地稳定,在绝大多数现代系统(无论是32位还是64位的Windows, Linux, macOS)上,int都被定义为4字节(32位),这是因为C语言的设计初衷是int应该能够高效地表示机器的“自然”整数大小,而32位整数在过去和现在都是最通用的。long的变化:long的大小则不那么稳定。- 在32位系统上,为了和
int对齐,long通常也是4字节。 - 在64位系统上,为了处理更大的地址空间和数值,编译器将
long扩展为8字节(64位),这是为了与系统的指针大小保持一致,并满足更大的数值范围需求。
- 在32位系统上,为了和
在64位系统上进行开发时,long 比 int 能表示的数值范围要大得多,如果你需要一个可能超过 int 范围的整数,long (或 long long) 是一个更安全的选择。

范围
由于大小不同,能表示的数值范围也不同。
一个有符号的n位整数,其表示范围是 -2^(n-1) 到 2^(n-1) - 1。
| 数据类型 | 大小(位) | 范围(有符号) |
|---|---|---|
int |
32 | -2,147,483,648 到 2,147,483,647 |
long (32位系统) |
32 | -2,147,483,648 到 2,147,483,647 |
long (64位系统) |
64 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
示例代码:验证大小
#include <stdio.h>
#include <limits.h> // 包含各种数据类型的限制信息
int main() {
printf("Size of int: %zu bytes\n", sizeof(int));
printf("Size of long: %zu bytes\n", sizeof(long));
printf("Range of int: %d to %d\n", INT_MIN, INT_MAX);
printf("Range of long: %ld to %ld\n", LONG_MIN, LONG_MAX);
return 0;
}
在64位Linux/macOS系统上的输出:

Size of int: 4 bytes
Size of long: 8 bytes
Range of int: -2147483648 to 2147483647
Range of long: -9223372036854775808 to 9223372036854775807
在32位系统上的输出:
Size of int: 4 bytes
Size of long: 4 bytes
Range of int: -2147483648 to 2147483647
Range of long: -2147483648 to 2147483647
(注意:sizeof(long) 的输出会是4)
标准规范
C标准(如C89, C99, C11)对它们的大小有最低要求,这解释了为什么它们在不同平台上表现不同。
int: 必须至少为 16位。long: 必须至少为 32位,并且必须至少和int一样大。
这就是为什么你几乎看不到小于4字节的 int 或 long 的现代系统,编译器为了满足最低要求并追求效率,通常会给予它们“舒适的”空间(如 int 32位,long 32或64位)。
性能考量
在64位系统上:
- 处理
int(32位):CPU通常需要将32位数据扩展到64位寄存器中进行处理,这会引入一个小的开销(称为“零扩展”或“符号扩展”)。 - 处理
long(64位):数据可以直接放入64位寄存器,处理起来更“原生”。
在64位系统上,如果你确定数值会非常大(超过 int 范围),使用 long 可能性能更好,如果你的数值肯定在 int 范围内,使用 int 通常是好的习惯,因为它更节省内存,并且在某些情况下(与旧的32位库交互时)可能更清晰。
使用建议
什么时候用 int?
- 默认选择:当你需要一个整数,并且没有特殊理由时,
int是你的首选,它简洁、通用,并且几乎在所有平台上表现一致。 - 数组索引、循环计数器:这些场景的数值通常不大,
int完全够用。 - 内存敏感的场景:如果你要存储数百万个整数,使用
int可以比long节省一半的内存。
什么时候用 long?
- 需要64位整数:在64位系统上,当你需要存储或计算超过
int范围(约±21亿)的大数时,必须使用long或long long。 - 与特定API或平台交互:某些操作系统API或函数可能明确要求使用
long类型的参数,在Linux的stat结构体中,st_size成员就是off_t类型,而off_t通常被定义为long。 - 代码可移植性(未来考虑):如果你编写的代码未来可能需要在32位和64位系统上无缝运行,并且需要保证数值范围一致,那么使用
long long(固定为64位)比long更好。
一个重要的“亲戚”:long long
为了解决 long 大小不统一的问题,C99标准引入了 long long。
- 大小:固定为8字节(64位),在所有平台上都如此。
- 范围:比
long更大(在64位系统上)。
什么时候用 long long?
当你需要一个确定是64位的整数,并且需要代码在不同平台(32位和64位)上行为一致时,long long 是最可靠的选择。
总结表格
| 特性 | int |
long |
|---|---|---|
| 大小 (64位系统) | 4 字节 | 8 字节 |
| 大小 (32位系统) | 4 字节 | 4 字节 |
| 平台依赖性 | 低 (非常稳定) | 高 (在64位系统上变大) |
| 主要用途 | 通用整数、循环、索引 | 需要更大数值范围、与特定API交互 |
| 性能 (64位系统) | 略有开销(需扩展) | 原生支持 |
| C标准最低要求 | 16位 | 32位 |
最后的忠告: 在编写现代C代码时,遵循这样的原则:
- 默认用
int。 - 当你需要超过
int范围的数时,在64位系统上用long,在需要跨平台保证64位时用long long。 - 永远不要凭空猜测类型的大小,使用
sizeof()运算符或<limits.h>中的宏(如INT_MAX)来获取准确信息。
