Namespaces
Variants

Integer constant

From cppreference.net

允许整型类型的值直接在表达式中使用。

目录

语法

整型常量是一种 非左值 表达式,其形式为

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起)

可在数字之间插入可选的单引号( ' )作为分隔符,编译器会忽略这些符号。

(since C23)

说明

1) 十进制整型常量(基数为10,首数字为最高有效位)。
2) 八进制整型常量(基数为8,首数字为最高有效位)。
3) 十六进制整型常量(基数为16,首位为最高有效位,字母 a f 表示十进制数值10至15)。
4) 二进制整型常量(基数为2,首数字为最高有效位)。

以下变量被初始化为相同的值:

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
unsigned long int (C99前)
long long int (C99起)

int

unsigned int
long int
unsigned long int
long long int (C99起)
unsigned long long int (C99起)

u U unsigned int

unsigned long int
unsigned long long int (C99起)

unsigned int

unsigned long int
unsigned long long int (C99起)

l L long int

unsigned long int (C99前)
long long int (C99起)

long int

unsigned long int
long long int (C99起)
unsigned long long int (C99起)

同时使用 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++ 文档 关于 整数字面量