整数常量
允许整数类型的值直接用于表达式。
目录 |
[编辑]语法
整数常量是拥有下列类型的非左值表达式
十进制常量整数后缀 (可选) | (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
下列对象也被初始化为相同值:
unsignedlonglong l1 = 18446744073709550592ull;// C99unsignedlonglong l2 =18'446'744'073'709'550'592llu;// C23unsignedlonglong l3 =1844'6744'0737'0955'0592uLL;// C23unsignedlonglong l4 =184467'440737'0'95505'92LLU;// C23
[编辑]整数常量的类型
整数常量类型是从依赖数字底和所用 整数后缀 的类型列表中,值所能吻合的首个类型。
后缀 | 十进制底 | 其他底 |
---|---|---|
无后缀 | int longint | int unsignedint |
u 或 U | unsignedint unsignedlongint | unsignedint unsignedlongint |
l 或 L | longint unsignedlongint(C99 前) | longint unsignedlongint |
l /L 与 u /U | unsignedlongint unsignedlonglongint(C99 起) | unsignedlongint unsignedlonglongint(C99 起) |
ll 或 LL | longlongint(C99 起) | longlongint(C99 起) unsignedlonglongint(C99 起) |
ll /LL 与 u /U | unsignedlonglongint(C99 起) | unsignedlonglongint(C99 起) |
wb 或 WB | _BitInt(N) 其中位宽 N 为大于 1 且可容纳值和符号位的最小的 N (C23 起) | _BitInt(N) 其中位宽 N 为大于 1 且可容纳值和符号位的最小的 N (C23 起) |
wb /WB 和 u /U | unsigned _BitInt(N) 其中位宽 N 为大于 1 且可容纳值位的最小的 N (C23 起) | unsigned _BitInt(N) 其中位宽 N 为大于 1 且可容纳值位的最小的 N (C23 起) |
若整数常量过大从而无法符合后缀/底结合所允许的任何类型,它没有 wb
、WB
、uwb
或 UWB
后缀,(C23 起)且编译器支持扩展整数类型(譬如 __int128 ),则常量可能以扩展整数类型给出;否则程序为谬构。
[编辑]注解
整数常量中的字母无关大小写: 0xDeAdBaBeU
和 0XdeadBABEu
表示同一个数(一个例外是 long-long-suffix ,必须是 ll
或 LL
,不能是 lL
或 Ll
)(C99 起)。
没有负整数常量。如 -1 的表达式是将一元负运算符应用到常量所表示的值。
当用于 #if 或 #elif 的控制表达式时,所有有符号整数常量都表现为如同拥有 intmax_t 类型,且所有无符号整数常量都表现为如同有 uintmax_t 类型。 | (C99 起) |
整数常量可用于整数常量表达式。
由于最大吞噬规则,以 e
和 E
结束的十六进制整数常量在后随运算符 +
或 -
时,源码中必须以空白符或括号将它们与运算符分隔:
int x =0xE+2;// 错误int y =0xa+2;// OKint z =0xE+2;// OKint 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);// 类型为 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", -9223372036854775807ll -1);// 组成有符号值 -9223372036854775808 的正确方式}
输出:
123 = 123 0123 = 83 0x123 = 291 12345678901234567890ull = 12345678901234567890 12345678901234567890u = 12345678901234567890 9223372036854775808 -9223372036854775808
[编辑]引用
- C23 标准(ISO/IEC 9899:2024):
- 6.4.4.1 Integer constants (第 57-60 页)
- C17 标准(ISO/IEC 9899:2018):
- 6.4.4.1 Integer constants (第 45-46 页)
- C11 标准(ISO/IEC 9899:2011):
- 6.4.4.1 Integer constants (第 62-64 页)
- C99 标准(ISO/IEC 9899:1999):
- 6.4.4.1 Integer constants (第 54-56 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 3.1.3.2 Integer constants
[编辑]参阅
整数字面量的 C++ 文档 |