命名空间
变体
操作

整数常量

来自 cppreference.cn
< c‎ | language

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

目录

[编辑] 语法

整数常量是 非左值 表达式,形式为

十进制常量 整数后缀(可选) (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 起)

[编辑] 解释

1) 十进制整数常量 (基数 10,第一位数字是最高有效位)。
2) 八进制整数常量 (基数 8,第一位数字是最高有效位)。
3) 十六进制整数常量 (基数 16,第一位数字是最高有效位,字母 af 代表十进制值 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 起)

uU unsigned int

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

unsigned int

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

lL 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/Lu/U 都有 unsigned long int

unsigned long long int(自 C99 起)

unsigned long int

unsigned long long int(自 C99 起)

llLL long long int(自 C99 起) long long int(自 C99 起)

unsigned long long int(自 C99 起)

ll/LLu/U 都有 unsigned long long int(自 C99 起) unsigned long long int(自 C99 起)
wbWB _BitInt(N) 其中宽度 N 是大于 1 的最小 N,它可以容纳该值和符号位(自 C23 起) _BitInt(N) 其中宽度 N 是大于 1 的最小 N,它可以容纳该值和符号位(自 C23 起)
wb/WBu/U 都有 unsigned _BitInt(N) 其中宽度 N 是大于 0 的最小 N,它可以容纳该值(自 C23 起) unsigned _BitInt(N) 其中宽度 N 是大于 0 的最小 N,它可以容纳该值(自 C23 起)

如果整数常量的值太大,无法容纳后缀/基数组合允许的任何类型,并且它没有后缀 wbWBuwbUWB(自 C23 起) 并且编译器支持扩展整数类型 (例如 __int128),则该常量可能被赋予扩展整数类型;否则,程序是非良构的。

[编辑] 注意

整数常量中的字母不区分大小写:0xDeAdBaBeU0XdeadBABEu 表示相同的数字 (一个例外是 长长整型后缀,它是 llLL,绝不是 lLLl)(自 C99 起)

没有负整数常量。诸如 -1 之类的表达式将 一元负号运算符 应用于常量表示的值。

当在 #if #elif 的控制表达式中使用时,所有有符号整数常量都表现得好像它们具有 intmax_t 类型,而所有无符号整数常量都表现得好像它们具有 uintmax_t 类型。

(自 C99 起)

整数常量可以用于 整数常量表达式

由于 最大匹配原则,以 eE 结尾的十六进制整数常量,当后跟运算符 +- 时,必须在源代码中用空格或括号与运算符分隔开

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