在C语言中,长整型常数是指一个整数值,它的类型被声明为 long 或 long long,这通常是为了表示超出普通 int 类型范围的数值。

(图片来源网络,侵删)
合法的长整型常数可以分为以下几种情况:
十进制长整型常数
这是最常见的形式,你只需要在普通的十进制整数后面加上后缀 l 或 L 即可。
- 后缀:
l或L(推荐使用大写的L,因为小写的l容易被数字1混淆)。 - 示例:
123456789L// 一个合法的长整型常数42L// 合法0L// 合法-98765L// 合法(负数)
八进制长整型常数
如果要以八进制(以0开头)表示一个长整型,需要在八进制数字后面加上 l 或 L。
- 格式:
0+ 八进制数字 +l或L - 示例:
0777L// 合法,表示十进制的 51101234L// 合法,表示十进制的 6680L// 合法,表示十进制的 0
十六进制长整型常数
如果要以十六进制(以 0x 或 0X 开头)表示一个长整型,需要在十六进制数字后面加上 l 或 L。

(图片来源网络,侵删)
- 格式:
0x或0X+ 十六进制数字 +l或L - 示例:
0xFFFFL// 合法,表示十进制的 655350xABC123L// 合法0XDEADBEEFL// 合法,注意F是十六进制数字,L是后缀
long long 类型常数 (C99标准引入)
从C99标准开始,C语言引入了 long long 类型,它比 long 的范围更大,要表示 long long 类型的常数,需要使用 ll 或 LL 作为后缀。
- 后缀:
ll或LL(同样推荐大写)。 - 示例:
9223372036854775807LL// 合法,这是64位系统上long long的最大正值-9223372036854775808LL// 合法,这是64位系统上long long的最小负值0xFFFFFFFFFFFFFFFFULL// 合法,U表示无符号,LL表示长长整型
特殊情况:无符号长整型
你还可以同时使用 u 或 U (无符号) 和 l 或 L (长整型) 后缀。
- 后缀:
ul,uL,Ul,UL,lu,lU,Lu,LU - 示例:
123456UL// 合法,无符号长整型0xFFFFFFFFUL// 合法,一个32位无符号长整型的最大值42LLU// 合法,无符号长长整型
总结表格
| 进制 | 格式示例 | 类型说明 |
|---|---|---|
| 十进制 | 123L, -456L |
long |
| 八进制 | 0777L, 0123L |
long |
| 十六进制 | 0xFFFFL, 0xABC123L |
long |
| 长长整型 | 9223372036854775807LL |
long long |
| 无符号长整型 | 123456UL, 0xFFFFFFFFUL |
unsigned long |
| 无符号长长整型 | 18446744073709551615ULL |
unsigned long long |
非法或容易出错的示例
123l合法,但非常不推荐,因为小写的l看起来很像数字1,容易造成阅读和误解,强烈建议始终使用大写的L。123不是长整型常数,它的类型取决于int和long的大小关系,在大多数现代系统上,int和long都是32位的,123会被当作int类型,如果这个值超出了int的范围,编译器会尝试将其提升为long。45L非法。.L后缀只能用于整数。45是一个浮点数,其后缀应该是f(float),F(float),l(long double)。0xGHL非法,十六进制数字只包含0-9和A-F(或a-f)。G,H,L是非法的十六进制字符。
为什么需要使用长整型常数?
当你需要一个很大的整数,并且担心它超出 int 类型的范围(通常是 -2,147,483,648 到 2,147,483,647)时,就应该使用长整型常数。
示例代码:

(图片来源网络,侵删)
#include <stdio.h>
int main() {
// 普通整数,可能超出 int 范围
// int a = 2147483648; // 在大多数系统上,这会导致编译警告或错误,因为2147483648 > INT_MAX
// 正确的做法:使用长整型常数
long b = 2147483648L; // 合法
printf("b = %ld\n", b); // %ld 用于打印 long 类型
// 使用 long long 处理更大的数
long long c = 9223372036854775807LL;
printf("c = %lld\n", c); // %lld 用于打印 long long 类型
return 0;
}
注意:打印 long 类型时,格式化字符串应使用 %ld;打印 long long 类型时,应使用 %lld,如果使用错误的格式(比如用 %d 打印 long),会导致未定义行为,通常是打印错误的数值。
