整型常数是直接写在代码中的整数,如 10, -50, 0 等,C语言为了满足不同场景的需求,允许使用多种形式来表示整型常数。

(图片来源网络,侵删)
合法的整型常数主要可以分为以下几类:
十进制整数
这是我们最熟悉的形式,由数字 0-9 组成,可以带有正负号。
规则:
- 由数字序列组成。
- 可以以可选的 或 符号开头。
- 不能有前导零(除非是数字
0本身)。
合法示例:

(图片来源网络,侵删)
123-456+7890(表示零)
非法示例:
0123(在C89/C90标准中,这会被当作八进制数,但在C99及以后的标准中,这是非法的,会产生编译警告或错误。)3(这是浮点数,不是整数)1_000(除非使用C23的数字分隔符,否则下划线是非法的)
八进制整数
八进制整数用于表示以8为基数的数。
规则:
- 必须以数字
0开头。 - 后面跟数字
0-7。
合法示例:
0123(表示十进制的1*8² + 2*8¹ + 3*8⁰ = 64 + 16 + 3 = 83)0777(表示十进制的511)0(也是合法的八进制表示)
非法示例:
123(没有前导0,是十进制)0189(包含了数字8和9,它们在八进制中是非法的)
十六进制整数
十六进制整数用于表示以16为基数的数,在编程中非常常用,尤其是在处理内存地址、颜色值等场景。
规则:
- 必须以
0x或0X开头。 - 后面跟数字
0-9和字母a-f或A-F。
合法示例:
0x1A(表示十进制的1*16¹ + 10*16⁰ = 16 + 10 = 26)0XFF(表示十进制的255)0x7fffffff(在32位系统上,常用来表示int类型的最大正整数)
非法示例:
1A(缺少0x前缀)0xGH(包含了非法字符G和H)
二进制整数 (C11及以后标准)
从C11标准开始,C语言原生支持了二进制整数的表示,这使得处理位操作更加直观。
规则:
- 必须以
0b或0B开头。 - 后面跟数字
0或1。
合法示例:
0b1010(表示十进制的10)0B110011(表示十进制的51)0b1(表示十进制的1)
注意: 一些老旧的编译器可能不完全支持C11标准,因此二进制字面量可能不被支持或需要编译器特定的扩展。
后缀:指定整型类型
整型常数本身有默认类型,10 的默认类型是 int,但我们可以通过添加后缀来显式地指定其类型,这对于避免溢出和确保类型一致性非常重要。
后缀可以是大写或小写。
| 后缀 | 含义 | 示例 |
|---|---|---|
u 或 U |
无符号 | 10U, 0xFFu |
l 或 L |
长整型 | 1000L, 0123L |
ll 或 LL |
长长整型 | 10000000000LL |
ul 或 uL |
无符号长整型 | 10UL |
ull 或 uLL |
无符号长长整型 | 10000000000ULL |
组合使用: 后缀可以组合,顺序通常不重要。
lu或ul都表示unsigned long。llu或ull都表示unsigned long long。
示例:
123456789// 默认为int1234567890L//long123456789012345LL//long long(这个数字太大了,无法用int或long存储)4000000000U//unsigned int(在32位int系统上,4000000000会超出int范围,但可以存入unsigned int)40000000000ULL//unsigned long long
总结表格
| 类型 | 前缀 | 示例 | 默认类型 |
|---|---|---|---|
| 十进制 | 无 | 123, -456, +789 |
int |
| 八进制 | 0 |
0123, 0777 |
int |
| 十六进制 | 0x 或 0X |
0x1A, 0XFF |
int |
| 二进制 | 0b 或 0B |
0b1010, 0B1100 |
int (C11+) |
| 无符号 | u 或 U |
123U |
unsigned int |
| 长整型 | l 或 L |
123L |
long |
| 长长整型 | ll 或 LL |
123LL |
long long |
| 无符号长长整型 | ull 或 uLL |
123ULL |
unsigned long long |
综合示例
#include <stdio.h>
int main() {
// 十进制
int a = 123;
// 八进制
int b = 0123; // 十进制值为 83
// 十六进制
int c = 0x1A; // 十进制值为 26
// 二进制 (C11标准)
int d = 0b1010; // 十进制值为 10
// 带后缀
long e = 2147483648L; // 超过int最大值,用long存储
unsigned int f = 4294967295U; // unsigned int的最大值
// 打印结果
printf("a (dec) = %d\n", a);
printf("b (oct) = %d (dec) or %o (oct)\n", b, b);
printf("c (hex) = %d (dec) or %x (hex)\n", c, c);
printf("d (bin) = %d (dec)\n", d);
printf("e (long) = %ld\n", e);
printf("f (unsigned int) = %u\n", f);
return 0;
}
重要提示:
- 整型常数的类型会影响它在表达式中的计算方式和取值范围。
3000000000在32位int系统上会发生溢出,但3000000000U或3000000000LL则是合法的。 - 在编写代码时,选择合适的进制和后缀是写出健壮、可读代码的重要一环,使用十六进制表示位掩码,使用
ULL确保大数计算不溢出。
