C 参考手册
- C 语言
- C 的历史
- 基本概念
- 表达式
- 声明
- 初始化
- 函数
- 语句
- 静态断言
- 字符常量
- 函数声明
- 函数定义
- 转义序列
- 翻译阶段
- 标识符
- 作用域
- 生存期
- 查找与命名空间
- ASCII 码表
- 类型
- 遵从性
- 算术类型
- restrict 类型限定符
- 类型
- 对象与对齐
- 主函数
- 未定义行为
- 内存模型
- if 语句
- switch 语句
- for 循环
- while 循环
- do-while 循环
- continue语句
- break 语句
- goto语句
- return 语句
- 值类别
- 求值顺序
- 整数常量
- 浮点常量
- 字符串字面量
- 复合字面量
- 常量表达式
- 隐式转换
- 成员访问运算符
- 逻辑运算符
- 比较运算符
- 算术运算符
- 赋值运算符
- 自增/自减运算符
- 其他运算符
- sizeof 运算符
- _Alignof 运算符
- 转型运算符
- C 运算符优先级
- 泛型选择
- 标量初始化
- 数组初始化
- 结构体与联合体初始化
- 指针声明
- 数组声明
- 枚举
- 存储类指定符
- const 类型限定符
- volatile 类型限定符
- 结构体声明
- 联合体声明
- 位域
- _Alignas
- typedef 声明
- 原子类型
- 外部及试探性定义
- inline 函数指定符
- _Noreturn 函数指定符
- 变长参数
- 内联汇编
- 可分析性
- 替用运算符及记号
- C 关键词
- 预处理器
- C 标准库头文件
- 类型支持
- 程序支持工具
- 变参数函数
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 算法
- 数值
- 文件输入/输出
- 本地化支持
- 原子操作库
- 线程支持库
- 实验性 C 标准库
- 有用的资源
- 符号索引
- 注释
整数常量
允许整数类型的值直接用于表达式。
语法
整数常量是拥有下列类型的非左值表达式
decimal-constant integer-suffix(可选) | (1) | ||||||||
octal-constant integer-suffix(可选) | (2) | ||||||||
hex-constant integer-suffix(可选) | (3) | ||||||||
其中
- decimal-constant 是非零十进制数位(
1
、2
、3
、4
、5
、6
、7
、8
、9
),跟随零个或更多十进制数字(0
、1
、2
、3
、4
、5
、6
、7
、8
、9
) - octal-constant 是数字零(
0
)跟随零个或更多八进制数位(0
、1
、2
、3
、4
、5
、6
、7
) - hex-constant 是字符序列
0x
或字符序列0X
跟随一个或更多十六进制数位(0
、1
、2
、3
、4
、5
、6
、7
、8
、9
、a
、A
、b
、B
、c
、C
、d
、D
、e
、E
、f
、F
) - integer-suffix ,若提供则可包含下面一或两者,可以任何顺序出现:
- unsigned-suffix (字符
u
或字符U
) - long-suffix (字符
l
或字符L
或 long-long-suffix (字符序列ll
或LL
) (C99 起)
- unsigned-suffix (字符
解释
下列对象被初始化为相同值:
int d = 42; int o = 052; int x = 0x2a; int X = 0X2A;
整数常量的类型
整数常量类型是从依赖数字底和所用 integer-suffix 的类型列表中,值所能吻合的首个类型。
允许的整数常量类型 | ||
---|---|---|
后缀 | 十进制底 | 十六进制或八进制底 |
无后缀 | int
long int |
int
unsigned int |
u 或 U
|
unsigned int
unsigned long int |
unsigned int
unsigned long int |
l 或 L
|
long int
unsigned long int(C99 前) |
long int
unsigned long int |
l /L 与 u /U
|
unsigned long int
unsigned long long int(C99 起) |
unsigned long int
unsigned long long int(C99 起) |
ll 或 LL
|
long long int(C99 起) | long long int(C99 起)
unsigned long long int(C99 起) |
ll /LL 与 u /U
|
unsigned long long int(C99 起) | unsigned long long int(C99 起) |
若整数常量过大从而无法符合后缀/底结合所允许的任何类型,且编译器支持扩展整数类型(譬如 __int128 ),则常量可能以扩展整数类型给出;否则程序为病式。
注意
整数常量中的字母无关大小写: 0xDeAdBaBeU
和 0XdeadBABEu
表示同一个数(一个例外是 long-long-suffix ,必须是 ll
或 LL
,不能是 lL
或 Ll
)。
没有负整数常量。如 -1 的表达式是将一元负运算符应用到常量所表示的值,可能会引起隐式类型转换。
当用于#if或#elif的控制表达式时,所有有符号整数常量都表现为如同拥有 intmax_t 类型,且所有无符号整数常量都表现为如同有 uintmax_t 类型。
整数常量可用于整数常量表达式。
由于最大吞噬规则,以 e
和 E
结束的十六进制整数常量在后随运算符 +
或 -
时,源码中必须以空白符或括号将它们与运算符分隔:
int x = 0xE+2; // 错误 int y = 0xa+2; // OK int z = 0xE +2; // OK int q = (0xE)+2; // OK
否则形成一个非法的预处理数字记号,这会进一步导致分析失败。
示例
#include <stdio.h> #include <inttypes.h> int main(void) { printf("123 = %d\n", 123); printf("0123 = %d\n", 0123); printf("0x123 = %d\n", 0x123); printf("12345678901234567890ull = %llu\n", 12345678901234567890ull); // 类型为 64 位类型( unsigned long long 或可能的 unsigned long ) // 即使无 long 后缀 printf("12345678901234567890u = %"PRIu64"\n", 12345678901234567890u ); // printf("%lld\n", -9223372036854775808); // 错误 // 值 9223372036854775808 不能适合 signed long long , // 它是无后缀十进制整数常量所允许的最大值 printf("%llu\n", -9223372036854775808ull ); // 应用到无符号值的一元减将它从 2^64 减去 // 这给出无符号 9223372036854775808 printf("%lld\n", -9223372036854775807ull - 1); // 组成有符号值 -9223372036854775808 的正确方式 }
输出:
123 = 123 0123 = 83 0x123 = 291 12345678901234567890ull = 12345678901234567890 12345678901234567890u = 12345678901234567890 9223372036854775808 -9223372036854775808
引用
- C11 standard (ISO/IEC 9899:2011):
- 6.4.4.1 Integer constants (p: 62-64)
- C99 standard (ISO/IEC 9899:1999):
- 6.4.4.1 Integer constants (p: 54-56)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.1.3.2 Integer constants