这是一个非常基础且重要的概念,涉及到 C 语言中整数的表示范围和内存占用。

(图片来源网络,侵删)
long int 是什么?
long int 是 C 语言中的一种基本数据类型,用于表示整数,它的关键字是 long 和 int,它们可以组合使用,但通常我们直接使用 long 即可,因为编译器会默认将其解释为 long int。
// 以下三种声明方式在功能上是等价的 long int my_long_num; long another_long_num; long long_num; // 这是最常见的写法
long int 的核心特性:大小和范围
long int 最关键的两个特性是它占用的内存大小和它能表示的数值范围。
内存大小
在 C 语言中,一个数据类型的大小(以字节为单位)是由实现决定的,也就是说,它依赖于你使用的编译器和目标操作系统/架构。
-
在大多数现代 64 位系统(如 Linux, macOS, Windows 64位)上:
(图片来源网络,侵删)sizeof(long int)的结果是 4 字节(32位)。- 这和
int的大小通常是相同的。
-
在一些古老的 32 位系统或特定的嵌入式系统上:
sizeof(long int)的结果可能是 4 字节(32位)。- 但在某些情况下,为了提供更大的范围,它也可能是 8 字节(64位)。
关键点: 永远不要假设 long int 的大小,要确切知道它在你的环境中的大小,请使用 sizeof 运算符。
#include <stdio.h>
int main() {
printf("Size of long int on this system: %zu bytes\n", sizeof(long int));
return 0;
}
运行这段代码,你就能看到在你的环境中 long int 到底占多少字节。
数值范围
内存大小直接决定了数值范围,范围分为两种:有符号(可以表示正数、负数和零)和无符号(只能表示非负数)。

(图片来源网络,侵删)
默认情况下,long int 是有符号的。
-
当
long int是 4 字节(32位)时:- 有符号 (
long int): 范围是 -2,147,483,648 到 2,147,483,647 (即 -2³¹ 到 2³¹ - 1)。 - 无符号 (
unsigned long int): 范围是 0 到 4,294,967,295 (即 0 到 2³² - 1)。
- 有符号 (
-
当
long int是 8 字节(64位)时:- 有符号 (
long int): 范围是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 (即 -2⁶³ 到 2⁶³ - 1)。 - 无符号 (
unsigned long int): 范围是 0 到 18,446,744,073,709,551,615 (即 0 到 2⁶⁴ - 1)。
- 有符号 (
long int 与其他整数类型的比较
为了更好地理解 long int 的位置,我们来看一下它与 int 和 long long 的关系。
| 类型 | 常见大小 (字节) | 常见范围 (有符号) | 备注 |
|---|---|---|---|
char |
1 | -128 到 127 | 字符类型,本质上是小整数 |
short |
2 | -32,768 到 32,767 | 短整型,保证不小于 char |
int |
4 | -2,147,483,648 到 2,147,483,647 | 整型,大小由实现决定,但通常是机器的自然字长 |
long / long int |
4 或 8 | 取决于大小 | 长整型,保证不小于 int |
long long / long long int |
8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 长长整型,C99标准引入,保证不小于 long |
重要规则(由 C 标准保证):
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)sizeof(signed type) == sizeof(unsigned type)(sizeof(int)和sizeof(unsigned int)是一样的)
如何选择使用哪种整数类型?
这是一个非常好的编程习惯问题。
| 场景 | 推荐类型 | 理由 |
|---|---|---|
| 常规计数、循环变量、数组索引 | int |
int 是 C 语言中最自然、最高效的整数类型,除非有特殊需求,否则默认使用它。 |
需要非常大的整数(超过 long 的范围) |
long long |
long long 提供了 64 位的范围,足以满足绝大多数大数需求。 |
需要非常大的非负整数(超过 unsigned long 的范围) |
unsigned long long |
unsigned long long 的范围是 0 到 2⁶⁴ - 1,非常大。 |
| 需要确定大小的整数(跨平台开发) | <stdint.h> 中的类型 |
这是最佳实践! <stdint.h> 头文件定义了精确大小的整数类型,如 int32_t (正好32位), uint64_t (正好64位无符号) 等。 |
| 内存极其紧张(如嵌入式系统) | short 或 int |
如果数值范围允许,使用更小的类型可以节省内存。 |
代码示例
#include <stdio.h>
#include <limits.h> // 包含各种整数类型的限制信息
int main() {
// 声明一个 long int 变量
long int a = 2147483647; // 32位 long int 的最大值
long int b = -2147483648; // 32位 long int 的最小值
// 打印大小和范围
printf("Size of long int: %zu bytes\n", sizeof(long int));
printf("Size of int: %zu bytes\n", sizeof(int));
// 使用 <limits.h> 中的宏来获取精确范围
printf("Maximum value of a long int: %ld\n", LONG_MAX);
printf("Minimum value of a long int: %ld\n", LONG_MIN);
// 打印变量的值
printf("Value of a: %ld\n", a);
printf("Value of b: %ld\n", b);
// 演示溢出
a = a + 1; // 超过了 LONG_MAX
printf("Value of a after overflow: %ld (This is undefined behavior!)\n", a);
return 0;
}
long int是 C 语言中的长整型,用于表示可能超出int范围的整数。- 大小不固定:在 64 位系统上通常是 4 字节,在 32 位系统上可能是 4 或 8 字节。务必用
sizeof()检查。 - 有符号和无符号:默认为有符号,可以使用
unsigned long int来表示非负数,范围会翻倍。 - 选择类型要谨慎:
- 默认用
int。 - 需要更大范围用
long long。 - 追求跨平台、确定大小,请使用
<stdint.h>中的类型(如int32_t),这是现代 C 编程的推荐做法。
- 默认用
