Integer constant
允许整型类型的值直接在表达式中使用。
目录 |
语法
整型常量是一种 非左值 表达式,其形式为
| decimal-constant integer-suffix (可选) | (1) | ||||||||
| octal-constant integer-suffix (可选) | (2) | ||||||||
| hex-constant integer-suffix (可选) | (3) | ||||||||
| binary-constant integer-suffix (可选) | (4) | (自 C23 起) | |||||||
其中
-
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) -
binary-constant
是字符序列
0b或字符序列0B后跟一个或多个二进制数字(0,1) - integer-suffix ,如果提供,可以包含以下内容之一(无符号前缀可与其他后缀组合使用;若使用两个后缀,它们可以按任意顺序出现):
-
-
unsigned-suffix
(字符
u或字符U) -
long-suffix
(字符
l或字符L) 或 long-long-suffix (字符序列ll或字符序列LL) (C99起) -
bit-precise-int-suffix
(字符序列
wb或字符序列WB) (C23起)
-
unsigned-suffix
(字符
|
可在数字之间插入可选的单引号(
|
(since 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
表示相同的数值
(唯一例外是
long-long-后缀
,只能是
ll
或
LL
,不能是
lL
或
Ll
)
(C99 起)
。
不存在负整数常量。诸如 - 1 这样的表达式,是对常量所表示的值应用 一元减号运算符 的结果。
|
当在 #if 或 #elif 的控制表达式中使用时,所有有符号整型常量如同具有类型 intmax_t ,所有无符号整型常量如同具有类型 uintmax_t 。 |
(C99起) |
整型常量可用于 整型常量表达式 。
由于
最大吞噬原则
,以
e
和
E
结尾的十六进制整型常量,当其后跟随
+
或
-
运算符时,必须在源码中使用空白符或括号与运算符分隔:
int x = 0xE+2; // 错误 int y = 0xa+2; // 正确 int z = 0xE +2; // 正确 int q = (0xE)+2; // 正确
否则,会形成一个无效的预处理数字标记,导致后续分析失败。
示例
#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); // 即使没有 long 后缀,该类型也是 64 位类型(unsigned long long 或可能是 unsigned long) printf("12345678901234567890u = %"PRIu64"\n", 12345678901234567890u ); // printf("%lld\n", -9223372036854775808); // 错误: // 值 9223372036854775808 无法放入有符号 long long 类型中, // 这是无后缀十进制整数常量允许的最大类型 printf("%llu\n", -9223372036854775808ull ); // 一元减号应用于无符号值会从 2^64 中减去它, // 这会得到无符号值 9223372036854775808 printf("%lld\n", -9223372036854775807ll - 1); // 形成有符号值 -9223372036854775808 的正确方式 }
输出:
123 = 123 0123 = 83 0x123 = 291 12345678901234567890ull = 12345678901234567890 12345678901234567890u = 12345678901234567890 9223372036854775808 -9223372036854775808
参考文献
- C23 标准 (ISO/IEC 9899:2024):
-
- 6.4.4.1 整型常量 (页: 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 整型常量(页码:54-56)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 3.1.3.2 整型常量
参见
|
C++ 文档
关于
整数字面量
|