整数常量
允许直接在表达式中使用整数类型的值。
目录 |
[编辑] 语法
整数常量是 非左值 表达式,形式为
十进制常量 整数后缀(可选) | (1) | ||||||||
八进制常量 整数后缀(可选) | (2) | ||||||||
十六进制常量 整数后缀(可选) | (3) | ||||||||
二进制常量 整数后缀(可选) | (4) | (自 C23 起) | |||||||
其中
- 十进制常量 是一个非零的十进制数字 (
1
,2
,3
,4
,5
,6
,7
,8
,9
),后跟零或多个十进制数字 (0
,1
,2
,3
,4
,5
,6
,7
,8
,9
) - 八进制常量 是数字零 (
0
) 后跟零或多个八进制数字 (0
,1
,2
,3
,4
,5
,6
,7
) - 十六进制常量 是字符序列
0x
或字符序列0X
后跟一个或多个十六进制数字 (0
,1
,2
,3
,4
,5
,6
,7
,8
,9
,a
,A
,b
,B
,c
,C
,d
,D
,e
,E
,f
,F
) - 二进制常量 是字符序列
0b
或字符序列0B
后跟一个或多个二进制数字 (0
,1
) - 整数后缀,如果提供,可以包含以下之一 (除非无符号前缀可以与其他后缀之一组合;如果使用两个后缀,它们可以以任何顺序出现)
- 无符号后缀 (字符
u
或字符U
) - 长整型后缀 (字符
l
或字符L
) 或 长长整型后缀 (字符序列ll
或字符序列LL
)(自 C99 起) - 位精确整数后缀 (字符序列
wb
或字符序列WB
) (自 C23 起)
- 无符号后缀 (字符
可选的单引号 ( |
(自 C23 起) |
[编辑] 解释
a
到 f
代表十进制值 10 到 15)。以下变量被初始化为相同的值
int d = 42; int o = 052; int x = 0x2a; int X = 0X2A; int b = 0b101010; // C23
以下变量也被初始化为相同的值
unsigned long long l1 = 18446744073709550592ull; // C99 unsigned long long l2 = 18'446'744'073'709'550'592llu; // C23 unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C23 unsigned long long l4 = 184467'440737'0'95505'92LLU; // C23
[编辑] 整数常量的类型
整数常量的类型是可以容纳该值的第一个类型,来自类型列表,该列表取决于使用的数字基数和 整数后缀。
后缀 | 十进制基数 | 其他基数 |
---|---|---|
无后缀 | 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 起) |
wb 或 WB |
_BitInt(N) 其中宽度 N 是大于 1 的最小 N,它可以容纳该值和符号位(自 C23 起) | _BitInt(N) 其中宽度 N 是大于 1 的最小 N,它可以容纳该值和符号位(自 C23 起) |
wb /WB 和 u /U 都有 |
unsigned _BitInt(N) 其中宽度 N 是大于 0 的最小 N,它可以容纳该值(自 C23 起) | unsigned _BitInt(N) 其中宽度 N 是大于 0 的最小 N,它可以容纳该值(自 C23 起) |
如果整数常量的值太大,无法容纳后缀/基数组合允许的任何类型,并且它没有后缀 wb
、WB
、uwb
或 UWB
(自 C23 起) 并且编译器支持扩展整数类型 (例如 __int128),则该常量可能被赋予扩展整数类型;否则,程序是非良构的。
[编辑] 注意
整数常量中的字母不区分大小写:0xDeAdBaBeU
和 0XdeadBABEu
表示相同的数字 (一个例外是 长长整型后缀,它是 ll
或 LL
,绝不是 lL
或 Ll
)(自 C99 起)。
没有负整数常量。诸如 -1 之类的表达式将 一元负号运算符 应用于常量表示的值。
当在 #if 或 #elif 的控制表达式中使用时,所有有符号整数常量都表现得好像它们具有 intmax_t 类型,而所有无符号整数常量都表现得好像它们具有 uintmax_t 类型。 |
(自 C99 起) |
整数常量可以用于 整数常量表达式。
由于 最大匹配原则,以 e
和 E
结尾的十六进制整数常量,当后跟运算符 +
或 -
时,必须在源代码中用空格或括号与运算符分隔开
int x = 0xE+2; // error int y = 0xa+2; // OK int z = 0xE +2; // OK int q = (0xE)+2; // OK
否则,将形成单个无效的预处理数字记号,这将导致进一步的分析失败。
[编辑] 示例
#include <inttypes.h> #include <stdio.h> int main(void) { printf("123 = %d\n", 123); printf("0123 = %d\n", 0123); printf("0x123 = %d\n", 0x123); printf("12345678901234567890ull = %llu\n", 12345678901234567890ull); // the type is a 64-bit type (unsigned long long or possibly unsigned long) // even without a long suffix printf("12345678901234567890u = %"PRIu64"\n", 12345678901234567890u ); // printf("%lld\n", -9223372036854775808); // Error: // the value 9223372036854775808 cannot fit in signed long long, which // is the biggest type allowed for unsuffixed decimal integer constant printf("%llu\n", -9223372036854775808ull ); // unary minus applied to unsigned value subtracts it from 2^64, // this gives unsigned 9223372036854775808 printf("%lld\n", -9223372036854775807ll - 1); // correct way to form signed value -9223372036854775808 }
输出
123 = 123 0123 = 83 0x123 = 291 12345678901234567890ull = 12345678901234567890 12345678901234567890u = 12345678901234567890 9223372036854775808 -9223372036854775808
[编辑] 引用
- C23 标准 (ISO/IEC 9899:2024)
- 6.4.4.1 整数常量 (p: 57-60)
- C17 标准 (ISO/IEC 9899:2018)
- 6.4.4.1 整数常量 (p: 45-46)
- C11 标准 (ISO/IEC 9899:2011)
- 6.4.4.1 整数常量 (p: 62-64)
- C99 标准 (ISO/IEC 9899:1999)
- 6.4.4.1 整数常量 (p: 54-56)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 3.1.3.2 整数常量
[编辑] 参见
C++ 文档 关于 整数字面量
|